異なる長さの複数の.csvファイルを1つのファイルにマージする

異なる長さの複数の.csvファイルを1つのファイルにマージする

同様の問題があります複数の.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")

関連情報