Страницы

Поиск по вопросам

пятница, 12 октября 2018 г.

Обработка текстовых файлов

Есть задача по обработке и преобразованию файлов. Все файлы представляют собой аналог CSV(текст с разделителями)
дано два или более файлов. Необходимо "склеить" их по некоторым полям и выдать уже один, обработанный файл дан один файл. Необходимо выполнить преобразование полей, склейку из нескольких строк в одну и т.д. и тоже выдать один, обработанный файл.
Проблема в том, что единой структуры файлов нет. Т.е. файлы/пары файлов могут быть различны по полям/структуре
На данный момент идея по такой обработке таких файлов только одна:
Грузим файл/файлы в некую БД(in-memory, к примеру), предварительно в runtime прочитав структуру файла - создаем таблицы по структуре Выполняем некий SQL скрипт, на основании результатов которого формируем выходной файл
Вопрос: может есть какие-то наработанные алгоритмы/библиотеки по подобному преобразованию/обработке, чтобы не городить "велосипед"?
UPD: чтобы избежать привязки к структуре, конечно можно использовать некую NoSql, но тогда лишимся полноценной силы SQL


Ответ

Можно записать файл построчно в таблицу, например c колонками DOC_NAME, ROW_NUMBER, ROW_CONTENT
в DOC_NAME - имя файла в ROW_NUMBER - номер строки в ROW_CONTENT - считываем строку из файла, например, Имя;Фамилия;Год_Рождения;Место_рождения - Петр;Семенов;12.12.1980;г. Москва
Далее это строчку можно распарсить с помощью sql по столбцам и вставить в заранее подготовленную таблицу:
INSERT INTO PARSED_TABLE1 SELECT TRIM(SUBSTR(CON,0,INSTR(CON,CHR(59))-1)) NAME, TRIM(SUBSTR(CON,INSTR(CON,CHR(59),1,1)+1,INSTR(CON,CHR(59),1,2)- INSTR(CON,CHR(59),1,1)-1)) SURNAME, TRIM(SUBSTR(CON,INSTR(CON,CHR(59),1,2)+1,INSTR(CON,CHR(59),1,3)- INSTR(CON,CHR(59),1,2)-1)) BIRTHDAYDATE, TRIM(SUBSTR(CON,INSTR(CON,CHR(59),1,3)+1)) BIRTHPLACE FROM ( SELECT ROW_CONTENT CON FROM CONTENT_TABLE WHERE DOC_NAME="doc.csv")
По аналогии делаем запрос для заполнения PARSED_TABLE2, из 2-х таблиц склеиваешь новую как пожелаешь, можно сразу и без PARSED_TABLE склеивать. CHR(59) - это символ ; в ANSII
Вот также хорошая статья на тему чтения из .csv в Oraсle БД http://torofimofu.blogspot.ru/2015/10/oracle-csv.html

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

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