MySQL加载数据InFile;跳过行

时间:2016-09-07 00:32:17

标签: mysql load-data-infile

我花了相当多的时间在谷歌搜索这个,但我似乎无法指出自己正确的方向正是我正在寻找的。我的.csv文件的问题是,虽然行终止符是',,,,',但有些行不包括这个,所以当我导入文件时它很好,直到它到达其中一个,但它然后它对待它作为一条记录大约是标准记录应该具有的列数的两倍,然后它从那一点开始被抛弃。我需要做的是跳过具有超过正确列数(15)的记录(',,,'终止之间的数据)。我意识到每次发生这种情况时基本上会跳过2条记录,但这对于我正在使用相当大的数据集进行的操作来说是好的。

我遇到了IGNORE关键字,但这似乎不适用。我正在寻找的是:对于导入期间的每个记录,如果record.columns.count>则跳过记录。 15.这是我的导入声明,感谢您提供的任何帮助。

LOAD DATA LOCAL INFILE "/Users/foo/Desktop/csvData.csv"
INTO TABLE csvData
COLUMNS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY ',,,,';

1 个答案:

答案 0 :(得分:0)

如果您只想跳过格式错误的记录,只需要过滤好记录的简单awk命令是:

awk -F, '{ if (NF == 15) print; }' csvData.csv > csvData_fixed.csv

然后来自固定文件的LOAD DATA

如果你想变得更加漂亮,你可以使用awk(或Python或任何你喜欢的东西)编写一个脚本,以正确的格式重写格式不正确的记录。

重新评论:awk命令读取原始文件并仅输出每行恰好有15个字段,其中字段用逗号分隔。

显然你的输入数据没有正好有15个字段的行,即使你是这样说的。

另一种想法:使用' ,,,,'的线路终结器有点奇怪。在原始的LOAD DATA命令中。通常,线路终结器是' \ n'这是一个换行符。因此,当您将行终止符重新定义为' ,,,,'这意味着MySQL将继续阅读文本,直到找到' ,,,,'即使最终在多行文本中读取了数十个字段。也许您可以将行终止符设置为' ,,,, \ n'。