Shell-Script

將單個 CSV 行拆分為多個的腳本

  • February 16, 2015

我需要一個腳本,它可以獲取一個包含一列以分號分隔的屬性的 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

引用自:https://unix.stackexchange.com/questions/184156