단일 CSV 행을 여러 행으로 분할하는 스크립트 작성

단일 CSV 행을 여러 행으로 분할하는 스크립트 작성

세미콜론으로 구분된 속성 열이 포함된 CSV 파일을 가져와 여러 행으로 분할하여 다중 값 속성을 정규화할 수 있는 스크립트가 필요합니까? 시나리오는 다음과 같습니다.

현재의:

John,Doe,"Foo1;Bar1;Foo2;Bar2"

표적:

John,Doe,Foo1 
John,Doe,Bar1 
John,Doe,Foo2 
John,Doe,Bar2

편집 (답변):Avinash의 답변은 간단하고 충분하며 제가 댓글에서 지적했듯이 몇 가지만 변경하면 됩니다. 다음 업데이트(잘못된 스크립팅에 대해 미리 사과드립니다)는 Python 2.4를 사용하고 N 열을 수용하도록 Avinash의 답변을 업데이트합니다. 면책조항: 이 방법은 마지막 열이 다중 값 열인 경우에만 작동하지만 원하는 경우 일부 루프와 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"
       }
}

관련 정보