単一の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

おすすめ記事