同様の問題があります複数の.csvファイルの内容を単一の.csvファイルにマージするただし、長さの異なるcsvファイルの場合。
何を追加するべきですか?この回答のPerlスクリプト、長さの異なるcsvファイルを考慮するには?
他の方法で行う方法をご存知の方は自由にご提案ください。
答え1
paste -d, 1.csv 2.csv | sed 's/^,//; s/,$//' > out.csv
問題を解決しなければならない
paste
指定されたファイル順に列ごとにマージされます。 csv形式を使用して-d,
。ただし、貼り付けは空白行を項目として扱い、カンマを挿入します。sed
命令で削除されます。
これはリンクされた質問と同じことも行います。
答え2
すべての行が同じ数のフィールドを持つようにawkを使用するヒントは次のとおりです。
最初のcsvファイルに最大行数があるとします。それ以外の場合は動作しません。
$ cat 1.csv
a,b,c
d,e,f
g,h,i
$ cat 2.csv
foo,bar
baz,qux
$ paste -d, {1,2}.csv
a,b,c,foo,bar
d,e,f,baz,qux
g,h,i,
$ paste -d, {1,2}.csv | awk -F, -vOFS=, 'NR == 1 {n = NF} NF < n {NF = n} 1'
a,b,c,foo,bar
d,e,f,baz,qux
g,h,i,,
これ可能NF変数を設定するにはGNU awkが必要です。
答え3
このために小さなPythonスクリプトを作成するしかありませんでした。ファイルに保存(例:mergecols.py
実行可能にして出力)
./mergecols.py 2.csv 1.csv 1.csv 2.csv 2.csv 1.csv
する
foo,bar,a,b,c,a,b,c,foo,bar,foo,bar,a,b,c
baz,qux,d,e,f,d,e,f,baz,qux,baz,qux,d,e,f
,,g,h,i,g,h,i,,,,,g,h,i
(1.csv
他の2.csv
答えと同じ)スクリプトは次のとおりです。
#!/usr/bin/env python
import sys
fileNames = sys.argv[1:]
files = [ open(n, "rt") for n in fileNames ]
numberOfColumns = [ None ] * len(fileNames)
while True:
newParts = [ ]
foundEntries = False
for idx in range(len(files)):
line = files[idx].readline()
if line:
parts = line.strip().split(",")
if numberOfColumns[idx] is None:
numberOfColumns[idx] = len(parts)
else:
if numberOfColumns[idx] != len(parts):
raise Exception("Number of columns in '{}' changed".format(fileNames[idx]))
newParts += parts
foundEntries = True
else:
if numberOfColumns[idx] is None:
raise Exception("{} does not appear to contain lines".format(fileNames[idx]))
newParts += [ "" ] * numberOfColumns[idx]
if not foundEntries:
break
sys.stdout.write(",".join(newParts) + "\n")