もっとエレガントなバリエーションがあることは知っていますが、これらはシンプルで理解しやすいものでなければなりません。
混乱しないように変数を試してください
Assignfile ( filehan, 'EMP.txt');
Reset ( filehand );
CloseFile (FFile);
一方filehan
と他方filehand
とFFile
TStringList の特定の特性である SubStrings 関数に必要なコードは 1 行だけです。
sList.text:=StringReplace(AString,ADelimiter,#13#10,[rfReplaceAll]);
- 4つの変数のみ。
- 1 つの TStringList のみ。
Delphi 5 でテスト済み
var
LineOfText : String;
sList : TStringList;
filehand,Outfilehand: text;
function SubStrings(AString: String; ADelimiter: Char; var sList: TStringList):Boolean;
begin
sList.text:=StringReplace(AString,ADelimiter,#13#10,[rfReplaceAll]);
end;
begin
sList := TStringList.Create;
Assignfile ( filehand, 'EMP.txt');
Assignfile ( Outfilehand, 'FSTRING.txt');
Reset ( filehand );
Rewrite(Outfilehand);
try
While not EOF(filehand) do
begin
ReadLn ( filehand, LineOfText );
LineOfText:=StringReplace(LineOfText,': ',':',[rfReplaceAll]);
LineOfText:=StringReplace(LineOfText,' :',':',[rfReplaceAll]);
if pos(':210:',LineOfText)>0 then begin
substrings(LineOfText, ':' ,sList);
if (sList.Count=6) then
if (sList[3]='210') then writeln(Outfilehand,sList[0]+';'+sList[1]);
end;
end;
finally
sList.Free;
CloseFile (filehand);
CloseFile (Outfilehand);
end;
アップデート:
質問を理解したので、210
フィールド値のある行にのみ興味があります。新しいファイルのすべての行が必要な場合は、.
if pos(':210:',LineOfText)>0 then begin
substrings(LineOfText, ':' ,sList);
if (sList.Count=6) then
if (sList[3]='210') then writeln(Outfilehand,sList[0]+';'+sList[1]);
end;
と
substrings(LineOfText, ':' ,sList);
if (sList.Count=6) then
if (sList[3]='210') then
writeln(Outfilehand,sList[0]+';'+sList[1]+';'+sList[4]+';'+sList[5]);
if (sList.Count=3) then
writeln(Outfilehand,sList[0]+';'+sList[1]);
sList[3] のサイズまたは値に基づく:
- に書き込まれるフィールドを自分で定義できます
FSTRING.txt
。
更新 2:
どのように私はそれを行うだろう.
var
ParsedText : String;
inList,outList,sList : TStringList;
i:integer;
function SubStrings(lineText: String; var sList: TStringList):String;
begin
result:='ERROR';
lineText:=StringReplace(lineText,': ',':',[rfReplaceAll]);
lineText:=StringReplace(lineText,' :',':',[rfReplaceAll]);
sList.text:=StringReplace(lineText,':',#13#10,[rfReplaceAll]);
if (sList.Count=6) then
if (sList[3]='210') then result:=sList[0]+';'+sList[1]+';'+sList[4]+';'+sList[5] else
result:=sList[0]+';'+sList[1];
if (sList.Count=3) then result:=sList[0]+';'+sList[1];
end;
begin
inList := TStringList.Create;
outList := TStringList.Create;
sList := TStringList.Create;
try
inList.LoadFromFile('EMP.txt');
for i:= 0 to inList.Count-1 do begin
ParsedText := SubStrings(inList[i],sList);
if ParsedText <> 'ERROR' then outList.Add(ParsedText);
end;
outList.SaveToFile('FSTRING.txt');
finally
inList.Free;
outList.Free;
sList.Free;
end;
end;