按列拆分CSV文件

时间:2014-09-18 05:31:33

标签: csv

我有一个非常庞大的CSV文件。大约有1700列和40000行,如下所示:

x,y,z,x1,x2,x3,x4,x5,x6,x7,x8,x9,...(about 1700 more)...,x1700
0,0,0,a1,a2,a3,a4,a5,a6,a7,a8,a9,...(about 1700 more)...,a1700
1,1,1,b1,b2,b3,b4,b5,b6,b7,b8,b9,...(about 1700 more)...,b1700
// (about 40000 more rows below)

我需要将此CSV文件拆分为多个文件,这些文件包含的列数较少,如:

# file1.csv
x,y,z
0,0,0
1,1,1
... (about 40000 more rows below)

# file2.csv
x1,x2,x3,x4,x5,x6,x7,x8,x9,...(about 1000 more)...,x1000
a1,a2,a3,a4,a5,a6,a7,a8,a9,...(about 1000 more)...,a1000
b1,b2,b3,b4,b5,b6,b7,b8,b9,...(about 1000 more)...,b1700
// (about 40000 more rows below)

#file3.csv
x1001,x1002,x1003,x1004,x1005,...(about 700 more)...,x1700
a1001,a1002,a1003,a1004,a1005,...(about 700 more)...,a1700
b1001,b1002,b1003,b1004,b1005,...(about 700 more)...,b1700
// (about 40000 more rows below)

有没有任何程序或图书馆这样做?

我已经用Google搜索了,但我发现的程序只按行而不按列拆分文件。

或者我可以使用哪种语言来有效地执行此操作?

我可以使用R,shell脚本,Python,C / C ++,Java

4 个答案:

答案 0 :(得分:2)

您的示例数据和所需输出的单行解决方案:

cut -d, -f -3 huge.csv > file1.csv
cut -d, -f 4-1004 huge.csv > file2.csv
cut -d, -f 1005- huge.csv > file3.csv

cut程序在大多数POSIX平台上都可用,并且是GNU Core Utilities的一部分。还有Windows version

在python中更新,因为OP要求用可接受的语言编写程序:

# python 3 (or python 2, if you must)
import csv
import fileinput

output_specifications = (  # csv file name, selector function
    ('file1.csv', slice(3)),
    ('file2.csv', slice(3, 1003)),
    ('file3.csv', slice(1003, 1703)),
)
output_row_writers = [
    (
        csv.writer(open(file_name, 'wb'), quoting=csv.QUOTE_MINIMAL).writerow,
        selector,
    ) for file_name, selector in output_specifications
]

reader = csv.reader(fileinput.input())
for row in reader:
    for row_writer, selector in output_row_writers:
        row_writer(row[selector])

这适用于给定的样本数据,可以使用input.csv作为参数或通过stdin管道来调用。

答案 1 :(得分:0)

您可以在Microsoft Excel中打开该文件,删除多余的列,另存为文件#1的csv。对其他2个表重复相同的过程。

答案 2 :(得分:0)

使用像:

这样的小型Python脚本
fin = 'file_in.csv'
fout1 = 'file_out1.csv'
fout1_fd = open(fout1,'w')
...
lines = []

with open(fin) as fin_fd:
   lines = fin_fd.read().split('\n')

for l in lines:
   l_arr = l.split(',')
   fout1_fd.write(','.join(l_arr[0:3]))        
   fout1_fd.write('\n')   
   ...

...
fout1_fd.close()
...

答案 3 :(得分:0)

我通常使用开放式办公室(或微软excel以防你使用Windows)来做这件事而无需编写任何程序并更改文件并保存。以下是两个有用的链接,展示了如何做到这一点。

https://superuser.com/questions/407082/easiest-way-to-open-csv-with-commas-in-excel

http://office.microsoft.com/en-us/excel-help/import-or-export-text-txt-or-csv-files-HP010099725.aspx