我对Java编程相当陌生。我有这个要求从CSV文件(大约25列)中读取行,并使用JAVA将其加载到MySQL数据库。
-
数据必须每次插入一行,因为多表必须插入或更新每一行数据。
-
我需要一些机制来映射头(第一行在CSV与其相应的值),以便在将来如果我要在CSV文件中添加另一列,它不会影响我的程序。
-
它们可能是我的CSV文件中的字段,由","逗号组成,作为字段值的一部分。
-
使用的分隔符也是",",逗号。
关于我应该从哪里开始和要遵循的步骤的任何建议。在插入每一行之前,我需要从DB执行多个选择语句,因为很少的数据可能已经填充在相关的表中,我需要查询出项目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(如果它们存在),如果它们不存在,那么首先插入这些记录以获得相应的ID,然后将数据插入Product_Table:
CSV的第一次加载将少于1000条记录的最大值,接下来的加载将只有最多50条记录的任何一天。所以时间不是问题。逻辑和
我正在考虑一些逻辑来存储CSV中的每个值在一些变量中,如
ProductID = ProductID value from CSV
ProductName = Name value from CSV
所以在将来,如果CSV中的值的顺序改变,即使这样,我也可以使用这些变量来插入和查询我的MYSQL表模式
使用univoc -parser自带的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许可)。