2015-07-23 4 views
0

Я довольно новичок в программировании на Java. У меня есть это требование, чтобы прочитать строку строк из файла CSV (приблизительно 25 столбцов) и загрузить его в базу данных MySQL с помощью JAVA.Анализ файлов CSV и сохранение значений в переменной

  1. Данные должны вставляться по 1 строке за раз, так как несколько таблиц необходимо вставлять или обновлять с каждой строкой данных.

  2. Мне нужен какой-то механизм для отображения заголовка (1-я строка в CSV с соответствующими значениями), так что в будущем, если я добавлю еще один столбец в файл CSV, это не повлияет на мою программу.

  3. Их могут быть поля в моем CSV-файле, которые состоят из запятой «,» как части значения поля.

  4. Используемый разделитель также является «,» запятой.

Любое предложение о том, где я должен начинать и какие шаги следует выполнять. Мне нужно выполнить оператор множественного выбора из БД перед вставкой каждой строки, так как немногие из данных могут быть заполнены в связанных таблицах, и мне нужно запросить идентификатор товара, чтобы вставить главную запись.

Допустим, если у меня есть CSV с четырьмя пунктами,

ProductID , Name , Store Name , Country 
    101 , Pencil, Evergreen , Finland 

Поэтому мне нужно вставить эти значения в таблицу продукта с приведенной ниже схеме.

**Product_Table:** 
+------------------+----------------------+------+-----+---------+-------+ 
| Field   | Type     | Null | Key | Default | Extra | 
+------------------+----------------------+------+-----+---------+-------+ 
| Product_ID  | varchar(16)   | NO | PRI | NULL |  | 
| Name    | varchar(64)   | NO | MUL | NULL |  | 
| Store_ID   | int(10) unsigned  | NO |  | NULL |  | 
| Country_ID  | smallint(5) unsigned | NO |  | NULL |  | 


**Store_Table** 
+------------------+----------------------+------+-----+---------+-------+ 
| Field   | Type     | Null | Key | Default | Extra | 
+------------------+----------------------+------+-----+---------+-------+ 
| Store_ID   | varchar(16)   | NO | PRI | NULL | AI | 
| Name    | varchar(64)   | NO | MUL | NULL |  | 


**Country_Table** 
+------------------+----------------------+------+-----+---------+-------+ 
| Field   | Type     | Null | Key | Default | Extra | 
+------------------+----------------------+------+-----+---------+-------+ 
| Country_ID  | varchar(16)   | NO | PRI | NULL | AI | 
| Country_Name  | varchar(64)   | NO | MUL | NULL |  | 

Итак, как вы можете видеть, мне нужно передать в Название магазина и Страна Название поле значения из CSV, чтобы получить соответствующее удостоверение личности (если они существуют), и если они этого не делают, то Insert эти записи первых, чтобы получить соответствующее удостоверение личности, прежде чем вставить данные в Product_Table:

Первая загрузка CSV будет меньше, чем 1000 записей максимум и следующая загрузка будет только максимум 50 записей в любой день. Так что время не проблема. Логика и

Я думал о какой-то логики для хранения каждого значения из CSV в какой-либо переменной, как

ProductID = ProductID value from CSV 
ProductName = Name value from CSV 

, так что в будущем, если порядок значений в изменениях CSV, даже тогда я могу просто использовать эти переменные вставлять и запрашивать мою схему таблиц MYSQL.

+0

Возможно, вы можете использовать https://dev.mysql.com/doc/refman/5.1/en/load-data.html вместо java-синтаксического анализа? Вы можете использовать подзапрос для вычисления country_id. Использование нагрузки на изъятие Вы уменьшите количество операций с БД (выберите countri_ud и после store_id и только после вставки данных), и код будет работать быстрее. – ainlolcat

+0

Это звучит неплохо, но я думаю, что сначала попробую обычным способом, так как я просто изучаю основные шаги, прежде чем я смогу реализовать более эффективный метод на более позднем этапе. Спасибо за ввод –

+0

Вы должны использовать другой разделитель, если запятые являются частью допустимого значения – Romski

ответ

0

Используйте парсер CSV, который поставляется с uniVocity-parsers, чтобы справиться с этим для вас надежно:

CsvParserSettings settings = new CsvParserSettings(); // many options here, check the tutorial. 

CsvParser parser = new CsvParser(settings); 
List<String[]> allRows = parser.parseAll(new FileReader(new File("path/to/file.csv"))); 

На стороне JDBC, если вы используете PreparedStatement, просто перебрать allRows и вставить данные, используя statement.setObject(index + 1, row[index]) (при условии, индекс начинается с 0). Для большинства баз данных - и MySQL - один из них - вам не нужно преобразовывать строки в тип, ожидаемый базой данных.

Раскрытие информации: Я являюсь автором этой библиотеки. Это бесплатно и бесплатно (лицензия Apache V2.0).

 Смежные вопросы

  • Нет связанных вопросов^_^