MySQL 加载数据 InFile;如果跳过行

MySQL Load Data InFile; skip rows IF

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

然后LOAD DATA来自固定文件。

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


回复您的评论:awk 命令读取您的原​​始文件并仅输出恰好有 15 个字段的每一行,其中字段以逗号分隔。

显然您的输入数据没有恰好有 15 个字段的行,即使您是这样描述的。


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