2016-02-21 63 views
-2

我有一个文件/var/tmp/file.csv:BASH - 我如何确保csv文件真的是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 
+0

你得到什么样的错误? – Doug

+0

请报告该BUG。只有在这样做后,它才有效。 http://stackoverflow.com/a/29473734/285594 – YumYumYum

回答

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") 
0

1)^M需要加以否则CSV文件无法读取/解析固定(损坏)。

2)后固定^M与此perl -pE 's/(\^M|\r)//g' /var/tmp/flie.csv

然后我是能够运行在该修改的文件相同的故障的命令:

WORKS

$ 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 

WORKS:

#!/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"