길이가 다른 여러 .csv 파일을 하나의 파일로 병합

길이가 다른 여러 .csv 파일을 하나의 파일로 병합

비슷한 문제가 있습니다여러 .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")

관련 정보