数据库: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中执行此操作的有效方法是什么?
答案 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)
id
字段AUTO_INCREMENT。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
结果可能如下所示:
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