在Delphi中从文本文件中读取行时使用Delimiter

时间:2014-03-26 14:31:22

标签: delphi

我有一个问题,我不知道如何真正解决。目前我正在从文本文件中读取几行,但是我不想保留的行中有一些值。这些行就像

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) ;

我想我可能会做很多我想要的东西,试图将字符串的部分转换为浮点数/整数,但这看起来非常愚蠢。有什么建议吗?

谢谢!

2 个答案:

答案 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语言的基本知识。