我有一个.csv
文件如下:
"ID0054XX","PT. SUMUT","18 JL.BONJOL","SUMATERA UTARA, NORTH","MEDAN","","ID9856","PDSUIDSAXXX","","","","Y"
"ID00037687","PAN INDONESIA, PT.","JALAN JENDERAL, SUDIRMAN, SENAYAN","","INDIA","","ID566543","PINBIDJAXXX","","0601","","Y"
我有一个脚本,使用逗号,
作为分隔符,将每个逗号分隔的值分配给唯一变量。
该脚本的部分如下所示:
IFS=,
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read Key Name Address1 Address2 City State Country SwiftCode Nid Chips Aba IsSwitching
do
echo "-------------------------------------------------------------------"
echo "From Key : $Key"
echo "-------------------------------------------------------------------"
echo "-------------------------------------------------------------------"
echo "From Name : $Name"
它的作用是将引号内带有逗号的值与我期望的将每个值唯一地分离为其各自变量的输出分开。
我尝试替换逗号,IFS=[","]
但没有运气。任何建议/帮助都非常感谢。
您在这里做错了几件事:
尽管这是可能的,但效率非常低。它很慢,很难写,很难阅读并且很难正确执行。外壳不是为这种事情而设计的。
您正在尝试在没有csv解析器的情况下解析csv文件。
CSV不是一种简单的格式。您可以像在此处那样包含包含定界符的字段。您还可以具有跨多行的字段。尝试使用简单的模式匹配来解析任意CSV数据非常非常复杂,而且非常难以解决。
糟糕的解决方案是执行以下操作:
$ sed 's/","/"|"/g' file.csv |
while IFS='|' read -r Key Name Address1 Address2 City \
State Country SwiftCode Nid Chips Aba IsSwitching; do
echo "From Key : $Key"; echo "From Name : $Name";
done
From Key : "ID0054XX"
From Name : "PT. SUMUT"
From Key : "ID00037687"
From Name : "PAN INDONESIA, PT."
这将替换为所有","
,"|"
然后|
用作定界符。当然,如果您的任何字段都可以包含,那将失败|
。
干净的好方法是使用适当的脚本语言(而不是外壳程序)和csv解析器。例如,在Perl 1中:
$ cat file.csv | perl -MText::CSV -le '
$csv = Text::CSV->new({binary=>1});
while ($row = $csv->getline(STDIN)){ my ($Key, $Name, $Address1, $Address2, $City, $State, $Country, $SwiftCode, $Nid, $Chips, $Aba, $IsSwitching) = @$row;
print "From Key: $Key\nFrom Name: $Name";}'
From Key: ID0054XX
From Name: PT. SUMUT
From Key: ID00037687
From Name: PAN INDONESIA, PT.
或者,作为脚本:
#!/usr/bin/perl -l
use strict;
use warnings;
use Text::CSV;
open(my $fh, "file.csv");
my $csv = Text::CSV->new({binary=>1});
while (my $row = $csv->getline($fh)){
my (
$Key, $Name, $Address1, $Address2, $City,
$State, $Country, $SwiftCode, $Nid, $Chips,
$Aba, $IsSwitching
) = @$row;
print "From Key: $Key\nFrom Name: $Name";
}
请注意,您必须先安装Text::CSV
模块(cpanm Text::CSV
),然后可能要安装cpanm
(cpanminus
大多数发行版中的软件包)
另外,在Python 3中:
#!/usr/bin/env python3
import csv
with open('file.csv', newline='') as csvfile:
linereader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in linereader:
print("From Key: %s\nFrom Name: %s" % (row[0], row[1]))
将上面的Python代码另存为脚本并在文件上执行将打印:
$ foo.py
From Key: ID0054XX
From Name: PT. SUMUT
From Key: ID00037687
From Name: PAN INDONESIA, PT.
1是的,我知道这是一个UUoC,但是用这种方式写为一个衬纸更简单。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句