解析CSV文件并将值存储在变量

时间:2015-07-23 06:01:33

标签: java mysql parsing csv opencsv

我是Java编程的新手。 我有这个要求从CSV文件读取行行(大约25列)并使用JAVA将其加载到MySQL数据库中。

  1. 数据必须一次插入1行,因为必须为每行数据插入或更新多个表。

  2. 我需要一些机制来映射标题(CSV中的第一行及其对应的值),以便将来如果我要在CSV文件中添加另一列,它将不会影响我的程序。

  3. 它们可能是我的CSV文件中包含","的字段。逗号作为字段值的一部分。

  4. 使用的分隔符也是","逗号。

  5. 有关我应该从哪里开始以及要遵循的步骤的任何建议。 我需要在插入每一行之前从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表模式。

1 个答案:

答案 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许可证)。