如何将带有空格分隔的整数的文本文件加载到StringGrid?每个单元格的每个数字。网格必须是一个矩形,所以如果缺少一些数字,则应填充0。
这是我到目前为止所做的,但它需要设置行数和列数。
while not eof(f) do
begin
while not eoln(f) do
begin
read(f, data);
StringGrid1.Cells[p, l] := data;
inc(p);
end;
p := 0;
readln(f);
inc(l);
end;
答案 0 :(得分:1)
我个人会选择不在这里使用Pascal IO。如果您希望代码能够读取Unicode数据,那么Pascal IO无法帮助您。
您可以使用字符串列表来加载文件,然后从SplitString
单元StrUtils
来解析字符串。
procedure PopulateStringGrid(Grid: TStringGrid; const FileName: string);
var
Strings: TStringList;
Row, Col: Integer;
Items: TStringDynArray;
begin
Grid.RowCount := 0;//clear any previous data
Strings := TStringList.Create;
try
Strings.LoadFromFile(FileName);
Grid.RowCount := Strings.Count;
for Row := 0 to Strings.Count-1 do
begin
Items := SplitString(Strings[Row], ' ');
for Col := 0 to Grid.ColCount-1 do
if Col<Length(Items) then
Grid.Cells[Col, Row] := Items[Col]
else
Grid.Cells[Col, Row] := '0';
end;
finally
Strings.Free;
end;
end;
请注意,SplitString
可能不是您所需要的。例如,它不会将重复的分隔符合并为一个。要了解我的意思,请考虑以下输入:
Hello World
两个单词之间有4个空格,SplitString
将返回以下数组:
'Hello'
''
''
''
'World'
如果您希望将连续分隔符视为一个分隔符,则可以使用字符串列表的DelimitedText
属性:
procedure PopulateStringGrid(Grid: TStringGrid; const FileName: string);
var
TextFile, Line: TStringList;
Row: Integer;
begin
Grid.RowCount := 0;//clear any previous data
TextFile := TStringList.Create;
try
Line := TStringList.Create;
try
Line.Delimiter := ' ';
TextFile.LoadFromFile(FileName);
Grid.RowCount := TextFile.Count;
for Row := 0 to TextFile.Count-1 do
begin
Line.DelimitedText := TextFile[Row];
for Col := 0 to Grid.ColCount-1 do
if Col<Line.Count then
Grid.Cells[Col, Row] := Line[Col]
else
Grid.Cells[Col, Row] := '0';
end;
finally
Line.Free;
end;
finally
TextFile.Free;
end;
end;
答案 1 :(得分:0)
我建议试试这段代码 这是基本的,但我确信你可以解决你的问题。
procedure LoadFile(FileName: string; StringGrid: TStringGrid);
var
temp, fName, sName, eMail: string;
sgItem: TStringList;
f: textfile;
begin
assignfile(f, FileName);
reset(f);
sgItem := TStringList.Create;
StringGrid.RowCount := 2;
while not eof(f) do
begin
readln(f, temp);
fName := copy(temp, 1, pos('|', temp) - 1);
delete(temp, 1, pos('|', temp));
sName := copy(temp, 1, pos('|', temp) - 1);
delete(temp, 1, pos('|', temp));
eMail := temp;
sgItem.Clear;
sgItem.Add(fName);
sgItem.Add(sName);
sgItem.Add(eMail);
StringGrid.Rows[StringGrid.RowCount - 1].AddStrings(sgItem);
StringGrid.RowCount := StringGrid.RowCount + 1;
end;
sgItem.Free;
closefile(f);
end;
用法:
LoadFile('File.txt', StringGrid1);
贝尼
答案 2 :(得分:0)
试试这个
procedure FillStringgrid;
// Split the line of text into individual entries
procedure Split(const Delimiter: Char;Input: string;const Strings:TStrings);
begin
Assert(Assigned(Strings)) ;
Strings.Clear;
Strings.Delimiter := Delimiter;
Strings.DelimitedText := Input;
end;
var
strlst : Tstringlist;
myfile : TextFile;
search : string;
i,j : integer;
begin
i:= 0;
AssignFile(myfile,'filepath'); // specify your file path here
Reset(myFile);
while not eof(myfile) do
begin
Readln(myfile,search);
strlst:= Tstringlist.Create;
Split(' ',search,strlst); // get the no's separated by the delimiter
//adjust your column count based on no of entries
if StringGrid1.ColCount < strlst.Count then
StringGrid1.ColCount := strlst.Count;
StringGrid1.Rows[i]:=strlst; // adjust the row count
Inc(i);
StringGrid1.RowCount := i;
end;
// free stringlist and textfile
CloseFile(myfile) ;
strlst .free;
// fill in the blank entries with 0
for i := 0 to StringGrid1.RowCount - 1 do
begin
for j := 0 to StringGrid1.ColCount - 1 do
begin
if StringGrid1.Cells[j,i]='' then
StringGrid1.Cells[j,i]:='0';
end;
end;
end;