我正在尝试从.log文件中读取数据并处理其内容。日志文件由另一个应用程序创建。当我在Delphi中使用readln命令并在备忘录中显示文件的内容时,我只从一个包含超过6000行数据的文件中获取一行数据(ÿþI)。
procedure TForm1.Button1Click(Sender: TObject);
Var
F : TextFile;
s : string;
begin
AssignFile(F, 'data.log');
Reset(F);
while not Eof(F) do
begin
Readln(F, s);
Memo1.Lines.Add(s);
end;
end;
有谁知道问题可能是什么?
答案 0 :(得分:4)
你正在处理一个UTF-16文件(由前两个字符证明),并且Delphi 2007没有为此做好准备,所以它停止读取前0美元字节,因为Readln
认为线在那里结束。
您需要使用不同的方法来读取文件,并且您必须读入WideString(并可能将其转换为字符串)。由于Delphi 2007不具备适当的Unicode功能,我认为你还必须进行自己的行分割,但我没有这个,所以我不完全确定。
答案 1 :(得分:3)
正如Michael所说,您正在处理UTF-16编码文件,因此您必须手动加载和解码它。有各种基于WideString
的{{1}}类似的类在线浮动,或者Borland在TStringList
单元中有自己的实现,尝试使用其中一个而不是Pascal文件I / O,例如:
WideStrings
或者:
procedure TForm1.Button1Click(Sender: TObject);
var
SL : TWideStringList;
I: Integer;
s : string;
begin
SL := TWideStringList.Create;
try
SL.LoadFromFile('data.log');
Memo1.Lines.BeginUpdate;
try
for I := 0 to SL.Count-1 do
Memo1.Lines.Add(SL[I]);
finally
Memo1.Lines.EndUpdate;
end;
finally
SL.Free;
end;
end;
或者,安装TNTWare或TMS的副本,这两个副本都具有启用Unicode的组件。然后你应该能够直接{。1}} .log文件直接进入你选择使用的更多Unicode Memo组件。
答案 2 :(得分:0)
正如我对Remy的回答所述,在WideStrings中声明了一个TWideStrings / TWideStringList:
uses WidesStrings;
//...
var
Ws: TWideStrings;
s: string;
i: Integer;
begin
Ws := TWideStringList.Create;
try
ws.LoadFromFile('C:\temp\UniTest.txt');
for i := 0 to ws.Count - 1 do
begin
s := ws[i];
Memo1.Lines.Add(s);
end;
finally
ws.Free;
end;
end;
但请注意,这不是TStrings
后代,因此无法直接将其分配给像TMemo.Lines这样的TStrings属性,您必须逐个添加它们。
它似乎也无法处理BOM(您的ÿþ
)或大端编码