我是Java编程的新手。 我有这个要求从CSV文件读取行行(大约25列)并使用JAVA将其加载到MySQL数据库中。
数据必须一次插入1行,因为必须为每行数据插入或更新多个表。
我需要一些机制来映射标题(CSV中的第一行及其对应的值),以便将来如果我要在CSV文件中添加另一列,它将不会影响我的程序。
它们可能是我的CSV文件中包含","的字段。逗号作为字段值的一部分。
使用的分隔符也是","逗号。
有关我应该从哪里开始以及要遵循的步骤的任何建议。 我需要在插入每一行之前从DB执行Multiple Select语句,因为很少数据可能已经填入相关的表中,我需要查询Item ID以插入主记录表。
让我们说如果我有四个项目的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传入商店名称和国家/地区名称字段值以获取相应的ID(如果存在),如果在将数据插入 Product_Table之前,他们不会先插入这些记录以获取相应的ID
首次加载CSV的最大记录数将少于1000条,以下加载每天最多只能记录50条记录。所以时间不是问题。逻辑和
我在考虑将CSV中的每个值存储在某些变量中的逻辑,如
ProductID = ProductID value from CSV
ProductName = Name value from CSV
因此,在将来,如果CSV中的值的顺序发生变化,即使这样,我也可以使用这些变量来插入和查询我的MYSQL表模式。
答案 0 :(得分:0)
使用uniVocity-parsers附带的CSV解析器可靠地为您处理此问题:
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许可证)。