Часто сталкиваюсь с тем, что приходится разбирать текстовые файлы, как пример:
импорт почтовых адресов, импорт выписки из банка, платежи и .т.д
Файлы имеют разнообразную структуру и разные разделители.
Пример:
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;
импорт почтовых адресов, импорт выписки из банка, платежи и .т.д
Файлы имеют разнообразную структуру и разные разделители.
Пример:
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;
Комментариев нет:
Отправить комментарий