我有一个问题,我不知道如何真正解决。目前我正在从文本文件中读取几行,但是我不想保留的行中有一些值。这些行就像
int String Float float float
我只想拥有字符串部分并将该名称分配给列表框。我尝试使用分隔符只是为了一个空格,但我意识到它没有重置到下一行的开头但是从最后一个地方开始继续。
文本文件的第一行是
1 Betong 1.7 .24 2300
2 Armerad Betong 1.28 .26 2100
3 Cementbruk .93 .29 1800
使用带空格的分隔符给我
1
Armerad
0.93
虽然我希望它至少是
1
2
3
我现在的代码是onClickEvent for a按钮
的过程 var
SomeTxtFile : TextFile;
buffer : string;
holder : TStringList;
idx:integer;
begin
idx:=-1;
holder:=TStringList.Create;
AssignFile(SomeTxtFile, 'Opaque.lib') ;
Reset(SomeTxtFile) ;
while not EOF(SomeTxtFile) do
begin
idx:=idx+1;
ReadLn(SomeTxtFile, buffer) ;
holder.Delimiter:=' ';
holder.DelimitedText:=buffer;
ShowMessage(buffer) ;
WallsListBox.Items.Add(holder[idx]);
end;
CloseFile(SomeTxtFile) ;
我想我可能会做很多我想要的东西,试图将字符串的部分转换为浮点数/整数,但这看起来非常愚蠢。有什么建议吗?
谢谢!
答案 0 :(得分:2)
您正在打印idx列表的元素。要打印第一个元素,请使用
WallsListBox.Items.Add(holder[0]);
打印第二个(字符串)部分 - 使用
WallsListBox.Items.Add(holder[1]);
等等。请注意,字符串部分可能包含一些单词(Armerad Betong),因此您需要分析holder
内容。例如:
var
TextList, Holder: TStringList;
s: string;
i, j: integer;
dummy: Double;
begin
TextList := TStringList.Create;
Holder := TStringList.Create;
TextList.LoadFromFile('Opaque.lib');
for i := 0 to TextList.Count - 1 do begin
Holder.CommaText := TextList[i];
if Holder.Count >= 2 then begin
s := Holder[1];
j := 2;
while (j < Holder.Count) and
(not TryStrToFloat(Holder[j], dummy)) do begin
s := s + ' ' + Holder[j];
Inc(j);
end;
Memo1.Lines.Add(s);
end;
end;
Holder.Free;
TextList.Free;
答案 1 :(得分:0)
我没有使用TStringList来“分隔”文本(当你想要提取的字符串中有空格时它不起作用),我会使用另一种方法:删除最后三个单词和第一个单词(字符串以空格分隔)。剩下的必须是你正在使用的文本(假设所有行都包含int String Float float float的格式):
var
SomeTxtFile : TextFile;
buffer : string;
idx:integer;
begin
AssignFile(SomeTxtFile, 'Opaque.lib') ;
Reset(SomeTxtFile) ;
while not EOF(SomeTxtFile) do begin
ReadLn(SomeTxtFile, buffer);
ShowMessage(buffer);
idx:=length(buffer);
// First eliminitate all trailing spaces
while buffer[idx]=' ' do dec(idx);
// Then eliminate the third float value (search backwards for the space seperator)
while buffer[idx]<>' ' do dec(idx);
// Then eliminitate all spaces before the third float value
while buffer[idx]=' ' do dec(idx);
// Then eliminate the second float value (search backwards for the space seperator)
while buffer[idx]<>' ' do dec(idx);
// Then eliminitate all spaces before the second float value
while buffer[idx]=' ' do dec(idx);
// Then eliminate the first float value (search backwards for the space seperator)
while buffer[idx]<>' ' do dec(idx);
// Then eliminitate all spaces before the first float value
while buffer[idx]=' ' do dec(idx);
// Truncate the string to elimate all the characters we have determined to be the float values and their seperating spaces
setlength(buffer,idx);
// Now search from the beginning of the string
idx:=1;
// First eliminate all leading spaces
while buffer[idx]=' ' do inc(idx);
// Then eliminate the integer value
while buffer[idx]<>' ' do inc(idx);
// Then eliminate the spaces following the integer value
while buffer[idx]=' ' do inc(idx);
// We are now at the first character of the string we want, so step back one character
dec(idx);
// Delete the characters from the string that we have determined to be the integer value and the spaces surrounding it
delete(buffer,1,idx);
WallsListBox.Items.Add(buffer);
end;
CloseFile(SomeTxtFile);
end.
你也可以使用内置的POS功能,但我相信上面的代码会更易于理解(因为它似乎 - 没有冒犯)只具有Delphi / PASCAL语言的基本知识。