Есть ли утилита для переноса CSV-файла?

У меня есть некоторые csv-файлы со слишком большим количеством столбцов для LibreOffice Calc для открытия, но всего несколько строк. Если я могу транспонировать файл csv, он должен быть в порядке, поскольку Calc может обрабатывать очень много строк, чем столбцы.

3
задан 2 November 2011 в 13:06

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>
5
ответ дан 25 May 2018 в 17:18
  • 1
    Спасибо, спасибо (: Я использовал xrange, а не диапазон, чтобы работать немного быстрее (незначительная точка!). – drevicko 3 November 2011 в 12:06
  • 2
    хороший скрипт! есть дополнительные «)» в конце, в противном случае это потрясающе. – gare 24 August 2012 в 18:37

Вы можете использовать этот скрипт из оболочки следующим образом:

$ ./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)
2
ответ дан 25 May 2018 в 17:18

Для справки, здесь одно и то же заклинание в Ruby:

require 'CSV'

rows = CSV.new($stdin).read
puts rows.transpose.map { |x| x.join ',' }
1
ответ дан 25 May 2018 в 17:18

Другие вопросы по тегам:

Похожие вопросы: