세미콜론으로 구분된 속성 열이 포함된 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"
}
}