如何将文本文件的交替行拆分为两个数组?

时间:2011-08-31 21:13:11

标签: delphi

如何将文本文件中的数据读入两个数组?一个是字符串,另一个是整数?

文本文件的布局如下:

 Hello
 1
 Test
 2
 Bye
 3

每个数字对应于它上面的文字。任何人都可以帮助我吗?非常感谢它

2 个答案:

答案 0 :(得分:6)

var
  Items: TStringList;
  Strings: array of string;
  Integers: array of Integer;
  i, Count: Integer;
begin
  Items := TStringList.Create;
  try
    Items.LoadFromFile('c:\YourFileName.txt');
    // Production code should check that Items.Count is even at this point.

    // Actual arrays here. Set their size once, because we know already.
    // growing your arrays inside the iteration will cause many reallocations
    // and memory fragmentation.
    Count := Items.Count div 2;
    SetLength(Strings, Count);
    SetLength(Integers, Count);

    for i := 0 to Count - 1 do
    begin
      Strings[i] := Items[i*2];
      Integers[i] := StrToInt(Items[i*2+1]);
    end;
  finally
    Items.Free;
  end;
end

答案 1 :(得分:2)

我会将文件读入字符串列表,然后逐项处理。偶数列表放入字符串列表中,奇数列表放入数字中。

var
  file, strings, numbers: TStringList;
...
//create the lists
file.LoadFromFile(filename);
Assert(file.Count mod 2=0);
for i := 0 to file.Count-1 do
  if i mod 2=0 then 
    strings.Add(file[i])
  else
    numbers.Add(file[i]);

我可能会在自己的代码中使用一些名为oddeven的辅助函数。

如果你想要整数列表中的数字而不是字符串列表,那么你可以使用TList<Integer>并在奇数迭代上添加StrToInt(file[i])

为了便于编写此代码,我使用了列表而不是动态数组,但GolezTrol向您展示了如何使用动态数组,如果这是您喜欢的。

那就是说,既然你的状态是这个数字与字符串相关联,你可能会更喜欢这样的事情:

type
  TNameAndID = record
    Name: string;
    ID: Integer;
  end;

var
  List: TList<TNameAndID>;
  Item: TNameAndID;
...
  List := TList<TNameAndID>.Create;
  file.LoadFromFile(filename);
  Assert(file.Count mod 2=0);
  for i := 0 to file.Count-1 do begin
    if i mod 2=0 then begin
      Item.Name := file[i];
    end else begin
      Item.ID := StrToInt(file[i]);
      List.Add(Item);
    end;
  end;
end;

这种方法的优点是您现在可以保证名称和ID之间的关联将得到维护。如果你想要排序,插入或删除项目,你会发现上述结构比两个并行数组更方便。