有没有工具可以转置一个 .csv 文件?

我有一些包含太多列的CSV文件,LibreOffice Calc无法打开,但只有很少的行数。如果我可以转置这个CSV文件,那么Calc应该可以处理比列更多的行数。

我对这个问题真的很怀疑,它与Ubuntu有什么实际关联呢?只是一个诚实的怀疑而已。 - Mahesh
3个回答

一个简单的Python程序就可以完成这个任务(并且由于这段代码没有经过测试,请提前备份您的CSV文件!):
import csv
import sys
infile = sys.argv[1]
outfile = sys.argv[2]

with open(infile) as f:
    reader = csv.reader(f)
    cols = []
    for row in reader:
        cols.append(row)

with open(outfile, 'wb') as f:
    writer = csv.writer(f)
    for i in range(len(max(cols, key=len))):
        writer.writerow([(c[i] if i<len(c) else '') for c in cols])

你可以将这个保存为一个文件 "my_csv_transposer.py",然后在命令行中调用它,像这样:
python my_csv_transposer.py <theinfilename> <theoutfilename>

很好,效果很棒,谢谢(: 为了运行更快一点,我使用了xrange而不是range(小细节!)。 - drevicko
好剧本!末尾多了一个")",其他方面都很棒。 - gare

你可以像这样从shell中使用这个脚本:
$ ./transpose_csv < theinfilename > theoutfilename

这是脚本内容:
#!/usr/bin/env python
import sys, csv, itertools
rows = itertools.izip(*csv.reader(sys.stdin, delimiter=','))
sys.stdout.writelines(','.join(row) + '\n' for row in rows)

请参阅http://stackoverflow.com/a/4869245/309483。 - Janus Troelsen
使用Python3进行标准输入/输出的翻译:python3 -c "import sys,csv; csv.writer(sys.stdout).writerows(zip(*csv.reader(sys.stdin)))" - Janus Troelsen

为了参考,这里是同样的咒语在Ruby中的写法:
require 'CSV'

rows = CSV.new($stdin).read
puts rows.transpose.map { |x| x.join ',' }