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



数据库:MySQL

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

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

数据应该以以下方式添加到数据库中:

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

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

从文件加载数据的最快方法是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表1->(->`id`int不是空的auto_increment主键,->`number`int,->状态varchar(32)->);查询正常,0行受影响(0.13秒)mysql>mysql>加载数据本地文件'/tmp/test.csv'->INTO表格1->字段以","结尾->以","结尾的行->(编号);查询正常,6行受影响(0.00秒)记录:6已删除:0已跳过:0警告:0mysql>从表1中选择*;+----+--------+--------+|id | number | status|+----+--------+--------+|1|234546|NULL||2|345674|NULL||3 |464368|NULL||4|563236|NULL||5 |684269 |空||6|707853|NULL|+----+--------+--------+一组6行(0.00秒)

UPDATE:如果需要进行一些基本的转换或验证,可以使用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. 使id字段为AUTO_INCREMENT
  2. 设置其他字段的默认值
  3. 使用LOAD DATA INFOILE只插入一个字段-number,并将","设置为行分隔符

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

例如:

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

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

我建议使用bash-shell脚本直接处理这个问题,而不是使用Java。我们可以遵循以下步骤:

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

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

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

结果可能是这样的:

插入YOURTABLE(id,number)值(123546)

插入YOURTABLE(id,number)值(2345674)

插入YOURTABLE(id,number)值(3464368)

插入YOURTABLE(id,number)值(4563236)

然后执行这些SQL插入:

mysql -uUSERNAME -pPASSWORD -hHOST < insert.sql

相关内容

  • 没有找到相关文章

最新更新