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

Введение
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;  

Ну вот, пожалуй, и все что я хотел написать.
Теги:
CSV файл
Добавлено: 02 Августа 2018 07:46:55 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...