将包含百万个值的csv文件上传到mysql中的特定列

时间:2013-11-29 05:55:14

标签: java mysql database bulkinsert

数据库:MySQL

CSV文件包含大约百万条记录,如下所示:

234546,345674,464368,563236,684269,707853,...

数据应按以下方式添加到db中:

id|number|status| ...
-----------------------
 1|234546| ...  | ...
 2|345674| ...  | ...
 3|464368| ...  | ...
 4|563236| ...  | ...
 5|684269| ...  | ...
 6|707853| ...  | ...

当csv文件包含每列的值时,我发现了一些上传csv文件的方法。但在我的情况下,我必须将值插入特定列。在java中执行此操作的有效方法是什么?

4 个答案:

答案 0 :(得分:2)

从文件加载数据的最快方法是LOAD DATA INFILE。试试这种方式

LOAD DATA LOCAL INFILE '/path/to/your/file.csv'
IGNORE -- use this if you have duplicate numbers in the file and UNIQUE constraint defined on `number` column
INTO TABLE table1
FIELDS TERMINATED BY ','
LINES TERMINATED BY ','
(number)

我们试试吧

mysql> CREATE TABLE Table1
    -> (
    ->   `id` int not null auto_increment primary key, 
    ->   `number` int, 
    ->   `status` varchar(32)
    -> );
Query OK, 0 rows affected (0.13 sec)

mysql> 
mysql> LOAD DATA LOCAL INFILE '/tmp/test.csv'
    -> INTO TABLE table1
    -> FIELDS TERMINATED BY ','
    -> LINES TERMINATED BY ','
    -> (number);
Query OK, 6 rows affected (0.00 sec)
Records: 6  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from table1;
+----+--------+--------+
| id | number | status |
+----+--------+--------+
|  1 | 234546 | NULL   |
|  2 | 345674 | NULL   |
|  3 | 464368 | NULL   |
|  4 | 563236 | NULL   |
|  5 | 684269 | NULL   |
|  6 | 707853 | NULL   |
+----+--------+--------+
6 rows in set (0.00 sec)

更新:如果您需要进行一些基本的转换或验证,可以使用SET子句和用户变量

LOAD DATA LOCAL INFILE '/path/to/your/file.csv'
IGNORE INTO TABLE table1
FIELDS TERMINATED BY ','
LINES TERMINATED BY ','
(@number)
SET number = CONCAT('prefix', @number)

答案 1 :(得分:0)

  1. 设置id字段AUTO_INCREMENT。
  2. 设置其他字段的默认值。
  3. 使用LOAD DATA INFILE只插入一个字段 - number,并设置','作为行分隔符。

答案 2 :(得分:0)

最好的方法是在MySQL中使用LOAD DATA INFILE技术。

例如:

String path = "o.csv";
                String esquel = " LOAD DATA LOCAL INFILE " + path +
                            " INTO TABLE mytable" +
                            " LINES TERMINATED BY \'\\n\'";

statement.executeUpdate(esquel);

根据您的要求正确重写查询。这样做是直接加载,而不是使用JAVA JDBC API进行插入。

答案 3 :(得分:0)

我建议使用bash shell脚本直接处理这个问题,而不是使用Java。我们可能会按照以下步骤操作:

首先生成要插入的SQL语句:

  

tr',''\ n'< text.csv | grep -v“^ [\ t] * $”| awk'{print“INSERT   INTO YOURTABLE(id,number)VALUES(“NR”,“$ 1”)“}'> insert.sql

  • tr',''\ n'< text.csv:用换行符'\ n';
  • 替换','
  • grep -v“^ [\ t] * $”:删除空行;
  • awk ...> insert.sql:将SQL关键字添加到其中。

结果可能如下所示:

  

INSERT INTO YOURTABLE(id,number)VALUES(1,234546)

     

INSERT INTO YOURTABLE(id,number)VALUES(2,345674)

     

INSERT INTO YOURTABLE(id,number)VALUES(3,464368)

     

INSERT INTO YOURTABLE(id,number)VALUES(4,563236)

然后执行这些SQL插入:

mysql -uUSERNAME -pPASSWORD -hHOST < insert.sql