如何仅将tstringlist中的特定项保存到文件中
这是我的密码如何仅将tstringlist中的特定项保存到文件中,string,delphi,file,split,delphi-7,String,Delphi,File,Split,Delphi 7,这是我的密码 var filehan : Textfile; i : Integer; LineOfText : String; tsl : TStringList; Name, Emp_id : string; begin stf := TStringList.create; Assignfile ( filehan, 'EMP.txt'); Reset ( filehand ); While not EOF(filehan) do begin
var
filehan : Textfile;
i : Integer;
LineOfText : String;
tsl : TStringList;
Name, Emp_id : string;
begin
stf := TStringList.create;
Assignfile ( filehan, 'EMP.txt');
Reset ( filehand );
While not EOF(filehan) do
begin
inc(i);
ReadLn ( filehan, LineOfText );
tsl :=substrings(LineOfText, ':' );
Name := tsl[1];
Emp_id := tsl[0];
tsl.SaveToFile('FSTRING.txt');
end;
CloseFile (FFile);
end;
function SubStrings(AString: String; ADelimiter: Char): TStringList;
var
sList : TStringList;
curPos : Integer;
subString : String;
{ DelimiterPos : Integer}
begin
curPos := 1;
sList := TStringList.Create;
while (curPos <= Length(AString)) do
begin
subString := '';
While (AString[curPos] <> ADelimiter) and
(curPos <= Length(AString)) do
begin
subString := subString + Copy(AString,curPos,1);
curPos := curPos + 1;
end;
sList.Add(subString);
curPos := curPos + 1;
end;
Result := sList;
end;
如果该行第3个位置的编号为210,则我必须检索存储在数据库中的员工的更多详细信息。我怎么能做到
我想读文件中的所有行
谢谢您的时间。别忘了从tsl中回收内存,这样它就不会泄漏。 看起来你来自一些垃圾收集语言,懒惰的oen,你根本不考虑内存,比如PHP或Python 所以你最好阅读Delphi关于对象及其生命的帮助,或者阅读一些liek Delphi Foundation的书 在那之前。。。变体3:由于您似乎不具备控制和管理对象生命周期所需的技能,因此请使用引用计数类型,如数组或接口,对于这些类型,Delphi或多或少地控制它们的生命周期 根据您的回答,您可以起草一些变体,例如:
var sda: TStringDynArray;
begin
sda := SplitString(LineOfText, ':' );
Assignfile ( filehan2, 'FSTRING.txt');
Rewrite ( filehand2 );
try
WriteLN (filehan2, sda[0]); WriteLN (filehan2, sda[1]);
finally
CloseFile(filehan2);
end;
end;
好的-既然你告诉过你有旧的Delphi7-你没有SplitString函数。但是你可以抽出几分钟做一个
您还可以从以下网站获得有用的绝地代码库:
对于像
300:rani:joseph:210:500:700这样的示例,似乎真实数据周围有很多空间。
那么你应该把那些空格删掉。如WriteLN(filehan2,Trim(sda[0])代码>或类似的isl1.Clear.Add([Trim(isl2[0]),…。
阅读有关Trim
功能的手册
如果该行的编号为210
然后用“如果”语句检查它
var isl1, isl2, isl3: IJclStringList;
EveryLine: string; i: integer;
begin
isl1 := TJclStringList.Create;
isl2 := TJclStringList.Create;
isl3 := TJclStringList.Create;
isl1.LoadFromFile('EMP.txt');
// for EveryLine in isl1 do begin
// - this works in free Lazarus or modern Delphi, but not in D7 }
for i := 0 to isl1.Count - 1 do begin;
EveryString := isl1[i];
isl2.Split(EveryString, ':').Trim;
if isl2.Count >= 4 then // does 3rd element even exist ???
if StrToIntDef( isl2[3], -1 ) = 210 then
CallSomeProcedureToRetrieveMoreDetails;
isl3.Clear.Add( [ isl2[0], isl2[1] ] ).SaveToFile('FSTRING.txt');
end; // for
end; // function
不要忘记从tsl中回收内存,这样它就不会泄漏。
看起来你来自一些垃圾收集语言,懒惰的oen,你根本不考虑内存,比如PHP或Python
所以你最好阅读Delphi关于对象及其生命的帮助,或者阅读一些liek Delphi Foundation的书
在此之前,变体3:因为您似乎没有必要的技能来控制和管理对象的生命周期,所以请使用引用计数类型,如数组或接口,对于这些类型,Delphi或多或少地控制它们的生命周期
根据您的回答,您可以起草一些变体,例如:
var sda: TStringDynArray;
begin
sda := SplitString(LineOfText, ':' );
Assignfile ( filehan2, 'FSTRING.txt');
Rewrite ( filehand2 );
try
WriteLN (filehan2, sda[0]); WriteLN (filehan2, sda[1]);
finally
CloseFile(filehan2);
end;
end;
好的-既然你告诉过你有旧的Delphi7-你没有SplitString函数。但是你可以抽出几分钟来做一个
您还可以从以下网站获得有用的绝地代码库:
对于像300:rani:joseph:210:500:700这样的示例,似乎真实数据周围有很多空间。
然后你应该修剪掉那些空格。比如WriteLN(filehan2,trim(sda[0]);
或者isl1.Clear.Add([trim(isl2[0]),…。
阅读有关Trim
功能的手册
如果该行的编号为210
然后用“如果”语句检查它
var isl1, isl2, isl3: IJclStringList;
EveryLine: string; i: integer;
begin
isl1 := TJclStringList.Create;
isl2 := TJclStringList.Create;
isl3 := TJclStringList.Create;
isl1.LoadFromFile('EMP.txt');
// for EveryLine in isl1 do begin
// - this works in free Lazarus or modern Delphi, but not in D7 }
for i := 0 to isl1.Count - 1 do begin;
EveryString := isl1[i];
isl2.Split(EveryString, ':').Trim;
if isl2.Count >= 4 then // does 3rd element even exist ???
if StrToIntDef( isl2[3], -1 ) = 210 then
CallSomeProcedureToRetrieveMoreDetails;
isl3.Clear.Add( [ isl2[0], isl2[1] ] ).SaveToFile('FSTRING.txt');
end; // for
end; // function
我知道有更多优雅的变化,但这些应该是简单易懂的
尝试你的变量是不被混淆的
Assignfile ( filehan, 'EMP.txt');
Reset ( filehand );
CloseFile (FFile);
一个filehan
和另一个filehand
和FFile
根据TStringList的特殊特性,子字符串函数只需要一行代码
sList.text:=StringReplace(AString,ADelimiter,#13#10,[rfReplaceAll]);
- 只有4个变量
- 只有一颗水晶
用delphi5进行测试
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;
与
基于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;
var
ParsedText:String;
内列表、外列表、sList:TStringList;
i:整数;
函数子字符串(lineText:String;var-sList:TStringList):字符串;
开始
结果:='ERROR';
lineText:=StringReplace(lineText“:”,“:”,[rfReplaceAll]);
lineText:=StringReplace(lineText“:”,“:”,[rfReplaceAll]);
sList.text:=StringReplace(lineText,,,#13#10,[rfReplaceAll]);
如果(sList.Count=6),则
如果(sList[3]='210'),则结果:=sList[0]+';'+sList[1]+';'+sList[4]+';'+sList[5]else
结果:=sList[0]+';'+sList[1];
如果(sList.Count=3),则结果:=sList[0]+';'+sList[1];
结束;
开始
inList:=TStringList.Create;
outList:=TStringList.Create;
sList:=TStringList.Create;
尝试
inList.LoadFromFile('EMP.txt');
对于i:=0到inList.Count-1,开始
ParsedText:=子字符串(inList[i],sList);
如果ParsedText“错误”,则outList.Add(ParsedText);
结束;
SaveToFile('FSTRING.txt');
最后
inList.Free;
寿命长。免费;
sList.Free;
结束;
结束;
我知道还有更优雅的变体,但它们应该简单易懂
尝试你的变量是不被混淆的
Assignfile ( filehan, 'EMP.txt');
Reset ( filehand );
CloseFile (FFile);
一个filehan
和另一个filehand
和FFile
根据TStringList的特殊特性,子字符串函数只需要一行代码
sList.text:=StringReplace(AString,ADelimiter,#13#10,[rfReplaceAll]);
- 只有4个变量
- 只有一颗水晶
用delphi5进行测试
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;
与
基于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;
var
ParsedText:String;
内列表、外列表、sList:TStringList;
i:整数;
函数子字符串(lineText:String;var-sList:TStringList):字符串;
开始
结果:='ERROR';
lineText:=StringReplace(lineText“:”,“:”,[rfReplaceAll]);
lineText:=StringReplace(lineText“:”,“:”,[rfReplaceAll]);
sList.text:=StringReplace(lineText,'