我需要一个脚本,该脚本可以获取包含一列分号分隔属性的 CSV 文件,并将其分成多行以规范化该多值属性?这是场景:
当前的:
John,Doe,"Foo1;Bar1;Foo2;Bar2"
目标:
John,Doe,Foo1
John,Doe,Bar1
John,Doe,Foo2
John,Doe,Bar2
编辑(已回答):Avinash 的回答很简单、足够,并且正如我在评论中指出的那样,只需要进行一些更改。以下更新(提前为我糟糕的脚本道歉)更新了 Avinash 的答案以使用 Python 2.4 并容纳 N 个列。免责声明:只有当最后一列是多值列时,这仍然有效,但如果有人愿意,一些循环和 if/elses 可以解决这个问题。
#!/usr/bin/python3
import csv
import sys
fil = sys.argv[1]
f = open(fil)
try:
reader = csv.reader(f)
for i in reader:
l = []
for x in i:
if ';' in x:
m = x.split(';')
l.append(m)
splitCol = len(l)-1
else:
l.append(x)
for j in l[splitCol]:
strng = ''
for colCount in range(len(l)):
if colCount != splitCol and colCount == 0:
strng = strng+''.join(i[colCount])
elif colCount != splitCol and colCount != 0:
strng = strng+','+''.join(i[colCount])
elif colCount == splitCol and colCount == 0:
strng = strng+j
else:
strng = strng+','+j
print(strng)
finally:
f.close()
答案1
通过python3.
#!/usr/bin/python3
import csv
import sys
fil = sys.argv[1]
with open(fil) as f:
reader = csv.reader(f)
for i in reader:
l = []
for x in i:
if ';' in x:
m = x.split(';')
l.append(m)
else:
l.append(x)
for j in l[2]:
print(l[0]+','+l[1]+','+j)
将上面的脚本保存在一个文件中,并将其命名为script.py
.通过以下方式运行此脚本:
python3 script.py inputfile
答案2
如果您想要一些快速而肮脏的东西,并且知道您的数据恰好具有如图所示的三个字段,那么也许类似
awk -F, -vOFS=, '{split(substr($3,2,length($3)-2),a,";"); for (i in a) print $1,$2,a[i];}' file.csv
答案3
又一个pythonic
表格
#!/usr/bin/env python3
string= 'John,Doe,"Foo1;Bar1;Foo2;Bar2"'
result = [ string.split('"')[0] + x for x in string.split('"')[1].split(";")]
for i in result:
print(i)
输出:
$ ./test.py
John,Doe,Foo1
John,Doe,Bar1
John,Doe,Foo2
John,Doe,Bar2
答案4
#!/usr/bin/perl -n
if(/(.*?,)"(.*?;*?)"(.*)/){ my ($a,$b,$c)=($1,$2,$3) ;
for( split(/\s*;\s*/,$b )){
print "$a$_$c\n"
}
}