海量CSV到MySQL导入问题

问题描述:

问题:从我的仓库收到的CSV数据有超过200万个数字,我需要导入[多栏]表中的[单列]。我需要弄清楚如何将CSV文件导入到MySQL中,但有一些棘手的问题需要克服。经过一番研究,我还没有找到一个解决办法...海量CSV到MySQL导入问题

列可以被布置为这样的:(此数据不存在于数据库中还)

  • ID:自动递增值
  • serialCode:值从CSV得到
  • somethingID:分配给另一表ID值

    ID | serialCode | somethingID 
    -------------------------------- 
        1 | 1234567 |  42  
        2 | 2345678 |  21 
        3 | 3456789 |  14 
    

在下面的示例格式中有200万个序列号。每个数字都是一个单独的serialCode,用逗号分隔,并在一行中包含4个serialCodes。

7121316,8216697,5146909,5191409, 
8125250,6217542,5144896,8198066, 
3125654,9217139,2146880,1192013 

我需要做的就是插入这些串行代码到MySQL数据库,具体到只有serialCode列。 ID将自动增加,someID将在以后分配。

MySQL的LOAD DATA INFILE命令将会是你的朋友在这里:http://dev.mysql.com/doc/refman/5.5/en/load-data.html

创建该表第一话,我想下面的命令应该工作:

LOAD DATA INFILE "/path/to/file" INTO TABLE myTable LINES TERMINATED BY "," (serialCode) SET ID=NULL; 
+0

几个问题的答案。首先,我收到一条错误消息:**'字段列表'中的未知列'serialCode'**但该列是真正命名的,包括区分大小写的字母。其次,我相信您提供的代码会有问题,因为字段可能需要以“,”结尾。这是我的代码:'$ loadsql ='LOAD DATA INFILE“'。$ csvfile。'”INTO TABLE'。$ table。' “\ n”(serialCode)SET ID = NULL;' – MrFoobar 2011-05-04 18:26:34

+0

btw ...我试过你的代码,它给出了我上面提到的错误信息。 – MrFoobar 2011-05-04 18:30:17

+0

得到它的工作!这里是正确的代码'$ loadsql =“LOAD DATA INFILE'”。$ csvfile。“'INTO TABLE”。$ table。“FIELDS TERMINATED BY','LINES TERMINATED BY'\ r \ n'(serialcode)SET id = NULL ;“;' – MrFoobar 2011-05-04 18:40:06

您可以使用LOAD DATA INFILE这一点。棘手的部分是,你的行结束符有时是逗号,但有时它是一个逗号和换行符。

最简单的方法是将值加载到用户变量中,然后在设置表中的实际列变量时从用户变量中除去换行符。

像这样的东西应该为你工作:

LOAD DATA INFILE '/tmp/your_file.csv' 
INTO TABLE your_table 
LINES TERMINATED BY ',' 
(@serialCode) 
SET id = NULL, 
    serialCode = REPLACE(@serialCode,'\n',''); 
+0

如果文件的窗口行结尾符合“\ r \ n”的建议,那么只需将此解决方案中的'\ n'修改为'\ r \ n' – 2011-05-04 18:43:32

+0

James C,您的答案完成了此问题。插入过程现在已成功。注意*如果不添加\ r命令,则代码将在新的字段行中插入一个0。 – MrFoobar 2011-05-04 18:53:25

如果MySQL工具失败无论出于何种原因(内存限制,编码问题,无效CSV)你总是在你喜欢的编程语言来编写一个脚本选项解析并将csv的内容存储到数据库中。大多数编程语言都有csv解析能力。