пятница, 12 июля 2013 г.

Будем парсить!

Часто сталкиваюсь с тем, что  приходится разбирать текстовые файлы, как пример:
импорт почтовых адресов, импорт выписки из банка, платежи и .т.д
Файлы имеют разнообразную структуру и разные разделители.
Пример:
1; Иванов; Иван; Иванович; Украина; Луганская обл; Бойково; д22
2; Сидоров; Сидор;Сидорович;Россия;Какаято обл;Какой то город;Адресс

и того мы имеем структуру:
Код
Фамилия
Имя
Отчество
Страна
Область
Город
Адресс



В разных файлах структура может отличатся и количество полей быть разным.

Как же нам написать корректный парсер для конкретных целей?

Я не буду в даватся в тонкости программирования, а просто подскажу идею которую каждый сможет использовать по своему, и так.

Используем Delphi.
нам понадобится объект типа TStringList, который благополучно разбивает строку на подстроки
Собственно что мы и будем делать.
В каждой полученной с файла строке меняем разделитель на символ конца строки #13
после полученную строку помещаем в StringList
где он разбивает её на набор строк.
Теперь у нас каждая строка является полем записи.
Ниже пример кода:

Procedure TForm2.Button1Click(Sender: TObject);
const

  //Разделитель полей в текстовом файле
  delemiter=';';
var
  //Ссылка на файл
  TxtFile:System.TextFile;
  //Храним имя файла
  FileName:String;
  //Объект который и будет использоватся как парсер
  Parser:TStringList;
  //Буфер чтения
  Buffer:String;
begin
  //Как пример выбора файла
  FileName:='c:\data.csv';
  //Подготавливаемся к работе с файлом
  AssignFile(TxtFile,FileName);
  //Нам достаточно только чтение
  Reset(TxtFile);
  //Подготавливаем набор строк
  Parser:=TStringList.Create;
  //Разбераем
  while Not EOF(TxtFile) do
    begin
      //Считываем строчку с файла
     ReadLn(TxtFile,Buffer);
      //нормализуем
      Buffer:=StringReplace(Buffer,delemiter,#13,[rfReplaceAll]);
      //Получаем строку для разбора
      Parser.Text:=Buffer;
      //Теперь мы о строке можем узнать практически все
      //Parser.Count - количество столбцов
      //Parser.Strings[0..(Parser.Count-1)] - Массив в котором можно обратится к полю
      //...
      //Выполняем необходимые действия с разобранной строкой
      //...
    end;
    //Освобождаем объект
  Parser.Free;
  //Закрываем файл
  CloseFile(TxtFile);
end;

Комментариев нет:

Отправить комментарий