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