Shell-Script
將單個 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/else 可以解決這個問題。
#!/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()
通過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
如果您想要一些快速的’n’dirty,並且知道您的數據恰好具有如圖所示的三個欄位,那麼可能類似於
awk -F, -vOFS=, '{split(substr($3,2,length($3)-2),a,";"); for (i in a) print $1,$2,a[i];}' file.csv