【问题标题】:Import CSV Line Break Woes导入 CSV 换行问题
【发布时间】:2014-04-28 21:37:05
【问题描述】:

我正在使用 BASH 脚本将 LOAD DATA INFILE 运行到 MySQL。我的问题是试图正确终止一条线路。运行我的脚本后,我注意到每隔一行都被跳过了。以下是一些示例数据:

CSV 文件读取:

"COMP","POL","STATUS","TYPE","CODE","MODE","NUMBER"
"220","1243918,"TGI","NA","AS-T5","M6","793930""
"220","1653912,"TGS","NA","NON","M6","793975""
"220","1471618,"TGS","NA","AS-T6","M6","793915""

这是我导入 CSV 文件的 BASH 脚本:

mysql -u$User -p$Pass -D$Db<<EOFMYSQL
LOAD DATA INFILE '$InputFile' INTO TABLE $Table
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(comp,pol,status,type,code,mode,number);
EOFMYSQL

但这是我的行在我的数据库中的样子:

220  1243918  TGI  NA  AS-T5  M6 793930""220
220  1471618  TGS  NA  AS-T6  M6 793915""220

请注意,数据库中的最后一个字段 NUMBER 有两组引号和 CSV 文件中下一行的第一个字段。跳过第二行。

我尝试了许多不同的 LINES TERMINATED BY 选项,但就是不知道如何正确指定换行符?!

任何建议将不胜感激!

巴舍尔

【问题讨论】:

  • 我必须添加这是一个 Windows CSV 文件,如果我删除 ENCLOSED BY '"',我的行是正确的,但数据库中的每个值都有引号......

标签: mysql bash csv


【解决方案1】:

你可以通过运行检查你的文件中是否有奇怪的 Windowsy 回车:

cat -vet yourfile

并寻找“^M”

您可以通过以下方式删除它们

tr -d '\r' < WindowsFile > UnixFile

或使用“dos2unix”

已编辑

从您的 cmets 来看,您的行尾似乎有两组相邻的双引号 - 对吗?如果是这样,您可以使用以下方法将行尾的两个引号替换为一组引号:

sed 's/""$/"/' YourFile > NewFile

【讨论】:

  • 感谢@mark-setchell。我运行了 cat 命令,我确实在每一行的末尾看到了这个: ,"793930""^M$ 我在文件上运行了 dos2unix,现在我在最后看到了这个:,"793930""$ 现在如果我运行我要导入的相同 bash 脚本,它不导入任何记录,我将 TERMINATED BY 更改为 '\n' 并且它导入但跳过每隔一行。
  • 另外,跳过的行的第一个字段被附加到上一行的最后一个字段,正如我在原始帖子中所述:220 1243918 TGI NA AS-T5 M6 793930""220 行休息是一个鼻屎!
  • 你是完全正确的......行尾有两组引号,通过运行'sed'命令它解决了问题!非常感谢!
  • 太棒了!当一个计划一起出现时,我喜欢它!
  • 再次感谢!我要疯了!而且我没想过使用 dos2unix,尽管我在从 Windows 下载的脚本上使用它……和“sed”命令……从来没有听说过那个!现在我们已经开始工作了,现在可以开始所有艰苦的工作了..哈哈。
猜你喜欢
  • 1970-01-01
  • 2012-11-12
  • 2014-10-17
  • 2011-09-08
  • 2014-03-22
  • 1970-01-01
  • 2016-04-19
相关资源
最近更新 更多