MySQL加载数据填充;如果需要,则跳过行

MySQL加载数据填充;如果需要,则跳过行,mysql,load-data-infile,Mysql,Load Data Infile,我花了相当多的时间在谷歌上搜索这个,但我似乎无法准确地指出我要找的东西的正确方向。我的.csv文件的问题是,虽然行终止符是“,,,”,但有些行不包含此项,因此当我导入文件时,在到达其中一项之前,它是正常的,但它将其视为一条记录,其长度约为标准记录应有列数的两倍,然后从该点开始将其丢弃。我需要做的是跳过包含超过正确列数(15)的记录(在“,,,”终止之间的数据)。我意识到每次发生这种情况都会跳过2条记录,但对于我处理一个相当大的数据集来说,这没什么 我遇到了IGNORE关键字,但它似乎不适用。我想

我花了相当多的时间在谷歌上搜索这个,但我似乎无法准确地指出我要找的东西的正确方向。我的.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 ',,,,';

如果您只想跳过格式不正确的记录,只需使用一个简单的awk命令即可过滤好的记录:

awk -F, '{ if (NF == 15) print; }' csvData.csv > csvData_fixed.csv
然后从固定文件加载数据

如果您想变得更有趣,可以使用awk(或Python或任何您喜欢的)编写一个脚本,以正确的格式重写格式错误的记录


回复您的意见:awk命令读取原始文件并仅输出每行正好有15个字段的内容,其中字段用逗号分隔

显然,您的输入数据没有正好包含15个字段的行,即使您这样描述它



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

@Bill Karwin感谢您添加该标记。由于某些原因,csvData_fixed.csv文件已创建,但为空。我不熟悉awk命令,但我只是开始研究它,看看我是否能理解你在做什么。在导入之前修改文件的解决方案可以很好地工作,我只是不知道如何在这里进行故障排除。感谢您的帮助,我只使用“\n”作为行终止符,而不包括“,,,”就成功了。太简单了。。。你是对的,从来没有NF==15的条件,因为有些字段包含这样的字符串:“foo,bar”。中间逗号被捕获,即使它应该是一个字符串。再次感谢,我每天都学到新东西!如果您使用了CSV解析函数,则可以处理带引号字符串中嵌入的逗号,并且在任何脚本语言中都应该有合适的函数。不管怎样,我很高兴使用新行作为行终止符的建议奏效了!