Bash 加入 csv 文件
Bash join csv files
我有三个 .csv 文件:
File1.csv
Header1
data1;data2;data3
File2.csv
Header2
data1;data2;data3
data1;data2;data3
File3.csv
Header3
data1;data2;data3
我想这样加入他们:
Header1; ; ;Header2; ; ;Header3; ;
data1 ;data2;data3;data1 ;data2;data3;data1 ;data2;data3
; ; ;data1 ;data2;data3; ; ;
我一直在尝试用 paste
加入文件,但是列总是混淆。我认为发生这种情况是因为有时其中一个文件没有数据(只有 header)或 File2.csv 的数据多于 File1.csv。在这种情况下,它应该如下所示:
Header1; ; ;Header2; ; ;Header3; ;
; ; ;data1 ;data2;data3;data1 ;data2;data3
; ; ;data1 ;data2;data3; ; ;
paste
是完成此任务的最佳方法吗?
ps。我可以更改 .csv 文件的创建方式。我现在使用分号作为分隔符,但如果这样更容易,可以更改。
Python 解法:
merge_csv.py 脚本:
import sys
with open(sys.argv[1], 'r') as f1, open(sys.argv[2], 'r') as f2, open(sys.argv[3], 'r') as f3:
f1_lines, f2_lines, f3_lines = f1.read().splitlines(), f2.read().splitlines(), f3.read().splitlines()
max_lines = max(len(i) for i in (f1_lines, f2_lines, f3_lines))
fmt = '{:7s};' * 8 + '{:7s}'
for i in range(max_lines):
if i == 0:
print(fmt.format(f1_lines[i],'','',f2_lines[i],'','',f3_lines[i],'',''))
else:
f1_args = f1_lines[i].split(';') if i < len(f1_lines) else ['', '', '']
f2_args = f2_lines[i].split(';') if i < len(f2_lines) else ['', '', '']
f3_args = f3_lines[i].split(';') if i < len(f3_lines) else ['', '', '']
print(fmt.format(*(f1_args + f2_args + f3_args)))
用法:
python merge_csv.py File1.csv File2.csv File3.csv
输出:
Header1; ; ;Header2; ; ;Header3; ;
data1 ;data2 ;data3 ;data1 ;data2 ;data3 ;data1 ;data2 ;data3
; ; ;data1 ;data2 ;data3 ; ; ;
我有三个 .csv 文件:
File1.csv
Header1
data1;data2;data3
File2.csv
Header2
data1;data2;data3
data1;data2;data3
File3.csv
Header3
data1;data2;data3
我想这样加入他们:
Header1; ; ;Header2; ; ;Header3; ;
data1 ;data2;data3;data1 ;data2;data3;data1 ;data2;data3
; ; ;data1 ;data2;data3; ; ;
我一直在尝试用 paste
加入文件,但是列总是混淆。我认为发生这种情况是因为有时其中一个文件没有数据(只有 header)或 File2.csv 的数据多于 File1.csv。在这种情况下,它应该如下所示:
Header1; ; ;Header2; ; ;Header3; ;
; ; ;data1 ;data2;data3;data1 ;data2;data3
; ; ;data1 ;data2;data3; ; ;
paste
是完成此任务的最佳方法吗?
ps。我可以更改 .csv 文件的创建方式。我现在使用分号作为分隔符,但如果这样更容易,可以更改。
Python 解法:
merge_csv.py 脚本:
import sys
with open(sys.argv[1], 'r') as f1, open(sys.argv[2], 'r') as f2, open(sys.argv[3], 'r') as f3:
f1_lines, f2_lines, f3_lines = f1.read().splitlines(), f2.read().splitlines(), f3.read().splitlines()
max_lines = max(len(i) for i in (f1_lines, f2_lines, f3_lines))
fmt = '{:7s};' * 8 + '{:7s}'
for i in range(max_lines):
if i == 0:
print(fmt.format(f1_lines[i],'','',f2_lines[i],'','',f3_lines[i],'',''))
else:
f1_args = f1_lines[i].split(';') if i < len(f1_lines) else ['', '', '']
f2_args = f2_lines[i].split(';') if i < len(f2_lines) else ['', '', '']
f3_args = f3_lines[i].split(';') if i < len(f3_lines) else ['', '', '']
print(fmt.format(*(f1_args + f2_args + f3_args)))
用法:
python merge_csv.py File1.csv File2.csv File3.csv
输出:
Header1; ; ;Header2; ; ;Header3; ;
data1 ;data2 ;data3 ;data1 ;data2 ;data3 ;data1 ;data2 ;data3
; ; ;data1 ;data2 ;data3 ; ; ;