#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. Боюсь, у меня недостаточно кармы чтобы ответить на ваши комментарии.
Комментариев нет:
Отправить комментарий