Введение
CSV-файл – простейший по организации файл-таблица, который понимает Microsoft Excel. CSV – Como Separated Value – данные, разделенные запятой. Это обычный текстовый файл, в котором каждая строка олицетворяет ряд таблицы, а разделение этого ряда на колонки осуществляется путем разделения значений специальным разделителем. Обычно роль этого разделителя, судя из названия, играет запятая. Однако, встречается и другой разделитель – точка с запятой. Даже в Microsoft не определились, с каким разделителем должен работать Excel. При сохранении какой-либо таблицы в формате CSV, в качестве разделителя используется точка с запятой. Но, при открытии такого файла с помощью Microsoft Excel, нужно быть очень внимательным, так как, не знаю, шутка это или нет, существует, как Вы знаете два способа открытия файла:
В главном меню программы выбрать пункт «Открыть» из меню «файл».
Найти на жестком диске нужный файл и два раза кликнуть на нем мышкой.
Так вот, при открытии CSV файла первым способом, Excel использует точку с запятой в качестве разделителя, а при открытии вторым способом Excel использует запятую в качестве разделителя. Правда в Microsoft Excel XP эта проблема(?) решена, и используется только точка с запятой, не смотря на название файла.
Работа с 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;
Ну вот, пожалуй, и все что я хотел написать.