Страницы

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

воскресенье, 8 декабря 2019 г.

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

#java #файлы


Есть задача по обработке и преобразованию файлов. Все файлы представляют собой аналог
CSV(текст с разделителями)


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


Проблема в том, что единой структуры файлов нет. Т.е. файлы/пары файлов могут быть
различны по полям/структуре

На данный момент идея по такой обработке таких файлов только одна:


Грузим файл/файлы в некую БД(in-memory, к примеру), предварительно в runtime прочитав
структуру файла - создаем таблицы по структуре
Выполняем некий SQL скрипт, на основании результатов которого формируем выходной файл


Вопрос: может есть какие-то наработанные алгоритмы/библиотеки по подобному преобразованию/обработке,
чтобы не городить "велосипед"?

UPD: чтобы избежать привязки к структуре, конечно можно использовать некую NoSql,
но тогда лишимся полноценной силы SQL
    


Ответы

Ответ 1



Можно записать файл построчно в таблицу, например 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

Ответ 2



Все что вам нужно – CSVParser Пример использования взят отсюда: import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class CSVReader { public static void main(String[] args) { String csvFile = "/Users/mkyong/csv/country.csv"; String line = ""; String cvsSplitBy = ","; try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) { while ((line = br.readLine()) != null) { // use comma as separator String[] country = line.split(cvsSplitBy); System.out.println("Country [code= " + country[4] + " , name=" + country[5] + "]"); } } catch (IOException e) { e.printStackTrace(); } } } P.S. Боюсь, у меня недостаточно кармы чтобы ответить на ваши комментарии.

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

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