【问题标题】:BASH - how do i make sure the csv file is really csv file and its parsing correctly?BASH - 我如何确保 csv 文件真的是 csv 文件并且它的解析正确?
【发布时间】:2016-02-21 15:42:05
【问题描述】:

我有一个文件/var/tmp/file.csv:

f1;f2;f3;f4;f5;f6;f7;f8;f9;f10;f11;f12;13;14;15;16;^MB4NMA;AV;xx;28D;3;1;1;11160221;W6;3082;OTP;1510;;;0;0;^MABCD;EFG;MARION;33E;2;1;1;12160221;FR;3223;MAN;2215;;;0;0;

我需要插入 mysql 但所有工具都无法读取或插入。

失败:

#!/bin/bash
input="/var/tmp/file.csv"
while IFS=';' read -r f1 f2 f3 f4 f5 f6 f7
do
  echo "$f1 $f2 $f3 $f4 $f5 $f6 $f7"
done < "$input"

失败:

mysql> LOAD DATA LOCAL INFILE '/var/tmp/file.csv' replace
INTO TABLE file
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(f1,f2,f3)

失败:

$ mysqlimport --local -u root --ignore-lines=1 --fields-terminated-by=';' --columns='f1,f2,f3' database /var/tmp/file.csv -vvv --debug-info

【问题讨论】:

标签: mysql linux bash csv


【解决方案1】:

您可以使用进程替换来修复 while 循环中的 ^M

#!/bin/bash
input="/var/tmp/file.csv"
while IFS=';' read -r f1 f2 f3 f4 f5 f6 f7
do
  echo "$f1 $f2 $f3 $f4 $f5 $f6 $f7"
done < <(tr -d "\r" < "$input")

【讨论】:

    【解决方案2】:

    1) ^M 需要修复,否则 CSV 文件无法读取/解析(损坏)。

    2) 用这个perl -pE 's/(\^M|\r)//g' /var/tmp/flie.csv 修复^M 之后

    然后我能够在修改后的文件上运行相同的失败命令:

    有效

    $ mysqlimport --local -u root --ignore-lines=1 --fields-terminated-by=';' --columns='NOM' air /var/tmp/file.csv -vvv
    Connecting to localhost
    Selecting database ap
    Loading data from LOCAL file: /var/tmp/file.csv into file
    air.file: Records: 12306  Deleted: 0  Skipped: 0  Warnings: 12306
    Disconnecting from localhost
    

    作品:

    #!/bin/bash
    input="/var/tmp/file.csv"
    while IFS=';' read -r f1 f2 f3 f4 f5 f6 f7
    do
      echo "$f1 $f2 $f3 $f4 $f5 $f6 $f7"
    done < "$input"
    

    【讨论】:

      猜你喜欢
      • 2013-12-23
      • 1970-01-01
      • 2017-07-19
      • 2019-06-26
      • 1970-01-01
      • 2021-09-15
      • 2019-07-13
      • 2017-07-01
      • 1970-01-01
      相关资源
      最近更新 更多