лично я бы избирают не использовать 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;
Почему вы используете Pascal IO? Почему бы вам просто не загрузить файл в список строк и использовать функцию ['SplitString'] (http://docwiki.embarcadero.com/VCL/en/StrUtils.SplitString) для разделения каждой строки? –
Игнорировать ** NO PASCAL I/O ** банда, это нормально для этой задачи. Ваша проблема не является последовательной, как бы вы определяете позиции, если отсутствует несколько последовательных номеров? – OnTheFly
@ user539484 Чистый яд и злоба. Не классный. –