Delimiter и DelimitedText для текстовых файлов

Общие вопросы: версии и диалекты, синтаксис языка, cтруктуры и типы данных (массивы, строки, списки...), обработка данных и т.д.
Ответить
Ryumka
Сообщения: 14
Зарегистрирован: 06 окт 2009, 13:26

12 май 2010, 14:16

Добрый день!
У меня есть тектстовый файл с табуляцией. Необходимо его считать и отобразить с нужного номера строки в StringGrid.
Делаю это следующим образом:

[syntax='Delphi']

unit ReadFileTab;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;

type
TForm1 = class(TForm)
Button1: TButton;
StringGrid1: TStringGrid;
OpenDialog: TOpenDialog;
Memo1: TMemo;

procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i, LastRow, CommaPos,n, nomer,j: Integer;
FirstStr: string;
SList: TStringList;
j2, temp, max: integer;
Delimiter: String;
label A10;

begin
max := 0;
n:=0;
nomer:=0;

if not OpenDialog.Execute then Exit;
SList := TStringList.Create;
try
SList.LoadFromFile(OpenDialog.FileName); // открываем файл

StringGrid1.RowCount := SList.Count;
FirstStr := SList.Strings[75];
i := 0;
CommaPos := Pos(#9, FirstStr); // ищем табуляцию. Если находим, CommaPos>0

while CommaPos <> 0 do
begin
Delete(FirstStr, 1, CommaPos);
Inc(i);
CommaPos := Pos(#9, FirstStr); //рассчитываем количество колонок

end;
StringGrid1.ColCount := i + 1;
LastRow := StringGrid1.RowCount - 1;

for i := 0 to LastRow do
if (Pos('Сутки', SList.Strings)>0) or (n>0) then //ищем в файле номер строчки, с которой начнется запись в StringGrid

begin
n:=i;
if (n+i)>(2*LastRow) then GoTO A10; // если вышли за конец таблицы, заканчиваем цикл

With SList Do begin

Delimiter := #9; // оговариваем, что разделителем является табуляция

end ;

StringGrid1.Rows[nomer].DelimitedText:= SList.Strings; //представляем прочитанный файл в таблице StringGrid с учетом того, что разделителем являлась табуляция

nomer:=nomer+1;
A10:
end;


finally
SList.Free;
end;
StringGrid1.RowCount := nomer; // подгоняем количество строк в таблице под считанное количество, чтобы не было пустых строк в конце


// подгоняем ширину столбцов

for j2:=0 to (StringGrid1.RowCount-1) do
begin
temp := StringGrid1.canvas.textWidth(StringGrid1.cells[3, j2+1]);
if temp > max then
max := temp;

StringGrid1.colWidths[3] := max + StringGrid1.gridLineWidth + 1;

end;





end;

end.

[/syntax]



Все работает, только программа продолжает воспринимать разделитель как запятую, вместо табуляции. И поэтому название одной колонки формата "Вид, цвет" программа разбивает на две отдельных колонки. Отдельно "Вид" и отдельно "Цвет". Хотя табуляции между ними нет. Подскажите, пожалуйста, как указать, что разделителем в данном файле является исключительно знак табуляции и больше ничего.


Спасибо!
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

14 май 2010, 16:11

Delimiter := #9; // оговариваем, что разделителем является табуляция
может быть надо это не в переменную запихать, а в свойство?

см. TStrings.Delimiter
Изображение
Ryumka
Сообщения: 14
Зарегистрирован: 06 окт 2009, 13:26

20 май 2010, 15:47

Да я вроде так и сделала...

With SList Do begin
Delimiter := #9; // оговариваем, что разделителем является табуляция
end ;

Или это не одно и то же?
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

24 май 2010, 15:33

а это что?

var
...
Delimiter: String;
И, кстати, в цикле это делать не надо. Один раз сначала присваиваете, потом уже строки добавляете

Проверьте сразу после присваивания, чему равно SList.Delimiter

И лучше переменную удалить, чтоб не путаться :)
Изображение
Ответить