Введение
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;
Ну вот, пожалуй, и все что я хотел написать.
|