Работа с CSV файлами в Delphi.

Работа с CSV файлами в Delphi.

1.    Введение

CSV-файл – простейший по организации файл-таблица, который понимает Microsoft Excel. CSVComo Separated Value – данные, разделенные запятой. Это обычный текстовый файл, в котором каждая строка олицетворяет ряд таблицы, а разделение этого ряда на колонки осуществляется путем разделения значений специальным разделителем. Обычно роль этого разделителя, судя из названия, играет запятая. Однако, встречается и другой разделитель – точка с запятой. Даже в Microsoft не определились, с каким разделителем должен работать Excel. При сохранении какой-либо таблицы в формате CSV, в качестве разделителя используется точка с запятой. Но, при открытии такого файла с помощью Microsoft Excel, нужно быть очень внимательным, так как, не знаю, шутка это или нет, существует, как Вы знаете два способа открытия файла:

1.                       В главном меню программы выбрать пункт «Открыть» из меню «файл».

2.                       Найти на жестком диске нужный файл и два раза кликнуть на нем мышкой.

Так вот, при открытии CSV файла первым способом, Excel использует точку с запятой в качестве разделителя, а при открытии вторым способом Excel использует запятую в качестве разделителя. Правда в Microsoft Excel XP эта проблема(?) решена, и используется только точка с запятой, не смотря на название файла.

 

2. Работа с CSV файлами в Delphi

 

Для работы с CSV-файлами в Delphi Вам не понадобятся различные сторонние компоненты. Как я уже говорил, CSV-файл – это обычный текстовый файл. Следовательно, для работы с ним мы будем использовать стандартный тип TextFile определенный в модуле system.

Давайте напишем процедуру для загрузки CSV файла в таблицу TStringGrid. Это стандартный компонент Delphi для работы со строковыми таблицами. Находится он на странице Additional в палитре компонентов Delphi.

 

Вот код этой процедуры:

procedure LoadCSVFile (FileName: String; separator: char);

var f: TextFile;

    s1, s2: string;

    i, j: integer;

begin

 i := 0;

 AssignFile (f, FileName);

 Reset(f);

 while not eof(f) do

  begin

   readln (f, s1);

   i := i + 1;

   j := 0;

   while pos(separator, s1)<>0 do

    begin

     s2 := copy(s1,1,pos(separator, s1)-1);

     j := j + 1;

     delete (s1, 1, pos(separator, S1));

     StringGrid1.Cells[j-1, i-1] := s2;

    end;

   if pos (separator, s1)=0 then

    begin

     j := j + 1;

     StringGrid1.Cells[j-1, i-1] := s1;

    end;

   StringGrid1.ColCount := j;

   StringGRid1.RowCount := i+1;

  end;

 CloseFile(f);

end;

 

Теперь разберем этот код.

 

procedure LoadCSVFile (FileName: String; separator: char);

 

Это заголовок нашей процедуры. В качестве параметров мы передаем ей имя файла и разделитель данных.

 

AssignFile (f, FileName);

       Reset(f);

 

Здесь мы ассоциируем с файловой переменной f имя файла и открываем его для чтения.

 

while not eof(f) do

  begin

   readln (f, s1);

 

Пока не достигнут конец файла, читаем из него очередную строку.

Далее нам остается только разделить строку на много строк, используя в качестве разделителя символ separator, и записать эти строки в таблицу, учитывая то, что нужно увеличить число рядов на 1. Это делается следующим кодом:

   while pos(separator, s1)<>0 do

    begin

     s2 := copy(s1,1,pos(separator, s1)-1);

     j := j + 1;

     delete (s1, 1, pos(separator, S1));

     StringGrid1.Cells[j-1, i-1] := s2;

    end;

   if pos (separator, s1)=0 then

    begin

     j := j + 1;

     StringGrid1.Cells[j-1, i-1] := s1;

    end;

   StringGrid1.ColCount := j;

   StringGRid1.RowCount := i+1;

 

Ну вот, пожалуй, и все что я хотел написать. Если у Вас будут вопросы, то пишите их на мой электронный адрес: cpas@realcoding.net

© CPAS, 2004.



Опубликовал admin
17 Июн, Четверг 2004г.



Программирование для чайников.