编写脚本将单个 CSV 行拆分为多个

编写脚本将单个 CSV 行拆分为多个

我需要一个脚本,该脚本可以获取包含一列分号分隔属性的 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"
       }
}

相关内容