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

标签 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 ',,,,';

最佳答案

如果你只想跳过格式错误的记录,一个简单的 awk 命令只过滤好的记录是:

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

然后从固定文件LOAD DATA

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


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

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


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

关于MySQL加载数据InFile;如果跳过行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39359663/

相关文章:

mysql - 将 PostgreSQL 数据库转换为 MySQL 的推荐工具

java - JDBC 连接到 MYSQL 不使用代号一

mysql - 复杂的 SQL 连接查询 - 获取最新行

mysql - 从 Mysql 中的 IP 地址中删除点

jquery - 如何避免由于太多ajax调用而导致浏览器出现内存不足错误

mysql - 加载数据 INFILE - 绝望地卡住了

mysql - LOAD DATA INFILE,在包含微秒的时间戳周围加上引号

mysql - 使用 LOAD DATA INFILE 将 csv 上传到 mysql 表中

mysql - 对于 MySQL 中的 LOAD DATA INFILE,是否有允许缺失数据等于 NULL 的变通方法?

mysql - 将单列 CSV 加载到 MySQL