У меня есть некоторые csv-файлы со слишком большим количеством столбцов для LibreOffice Calc для открытия, но всего несколько строк. Если я могу транспонировать файл csv, он должен быть в порядке, поскольку Calc может обрабатывать очень много строк, чем столбцы.
Простая программа 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>
Вы можете использовать этот скрипт из оболочки следующим образом:
$ ./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)
Для справки, здесь одно и то же заклинание в Ruby:
require 'CSV'
rows = CSV.new($stdin).read
puts rows.transpose.map { |x| x.join ',' }