2009-08-07 5 views
6

Есть ли простой способ, используя обычный язык Unix-скриптов (Perl/Python/Ruby) или утилиту командной строки для преобразования файла таблицы Excel в CSV? В частности, это:Программно извлекать данные из электронной таблицы Excel

http://www.econ.yale.edu/~shiller/data/ie_data.xls

А конкретно третий лист этой таблицы (первые два, являющиеся графиками).

+0

Вот хороший сборник некоторых пакетов Python вместе с описаниями однострочных, которые могут быть полезны: HTTP: //www.python-excel.org/ – Aalok

ответ

1

я, возможно, нашли приемлемый ответ уже:

xls2csv

Но интересно услышать, что другие варианты есть, или о средствах на других языках.

8

Может xlrd будет делать работу (в Python)

редактировать: Я действительно научиться читать вопросы. Но писать csv не должно быть огромной проблемой, поэтому, возможно, вы действительно сможете ее использовать.

+0

+1: xlrd прекрасно работает. –

+0

Правильно, вывод CSV не имеет большого значения. Благодаря! – dreeves

1

Для python существует ряд опций, см. here, here и here. Обратите внимание, что последний вариант будет работать только в Windows с установленным Excel.

+3

pyXLreader, похоже, не поддерживается с 2005 года, имеет удивительную выдающуюся ошибку в трекерах sourceforge (пропускает фракции, все числа, представленные как целые числа), плюс еще несколько проблем, которые я нашел за несколько минут после игры (сбой на больших файлы, иногда печатает «FCUKDATE» (не шутите!), когда есть даты в данных, время, которое по крайней мере в 6 раз больше, чем у xlrd и возможно O (N ** 2), используемая память по крайней мере в 7 раз больше, чем у xlrd). Вы его используете самим? –

+0

Нет. Я кратко использовал xlrd, но я стараюсь хранить данные как CSV и работать с этим. У меня был список отзывов по этим трем сайтам, поэтому я подумал, что это может быть полезно. – DrAl

+1

Отзыв? Я не мог найти такую ​​вещь, используя Google. Отправьте ссылку. –

14

Существует хорошая библиотека Perl для чтения xls: Spreadsheet::ParseExcel.

+0

+1 Использовал это сам несколько лет назад; он определенно проделал свою работу. – BlairHippo

1

Варианты существуют для всех трех языков. Вопрос в том, с кем вы больше всего знакомы. Это тот язык, который вы должны использовать, конечно. И если вы тоже не знакомы, это приложение не очень хороший пример выбора между языками.

Мнение P.S: Если вы не знаете ни одного из языков, просто изучите Python и используйте xlrd.

+0

О, я не имел в виду это как вопрос о языковых войнах или что-то еще. Просто нужно было выполнить эту задачу и было счастливо использовать любой язык, который упростил бы его. – dreeves

4

Вы можете использовать pyexcelerator в python.

Этот код (входит в папку examples pyexcelerator как xls2csv.py) извлекает все листы из электронных таблиц и выводит их в stdout как CSV.

Вы можете легко изменить код, чтобы сделать то, что хотите.

Охлаждающая вещь о pyexcelerator заключается в том, что вы также можете использовать ее для создания write/create excel xls files, без установки excel.

#!/usr/bin/env python 
# -*- coding: windows-1251 -*- 
# Copyright (C) 2005 Kiseliov Roman 

__rev_id__ = """$Id: xls2csv.py,v 1.1 2005/05/19 09:27:42 rvk Exp $""" 


from pyExcelerator import * 
import sys 

me, args = sys.argv[0], sys.argv[1:] 


if args: 
    for arg in args: 
     print >>sys.stderr, 'extracting data from', arg 
     for sheet_name, values in parse_xls(arg, 'cp1251'): # parse_xls(arg) -- default encoding 
      matrix = [[]] 
      print 'Sheet = "%s"' % sheet_name.encode('cp866', 'backslashreplace') 
      print '----------------' 
      for row_idx, col_idx in sorted(values.keys()): 
       v = values[(row_idx, col_idx)] 
       if isinstance(v, unicode): 
        v = v.encode('cp866', 'backslashreplace') 
       else: 
        v = str(v) 
       last_row, last_col = len(matrix), len(matrix[-1]) 
       while last_row < row_idx: 
        matrix.extend([[]]) 
        last_row = len(matrix) 

       while last_col < col_idx: 
        matrix[-1].extend(['']) 
        last_col = len(matrix[-1]) 

       matrix[-1].extend([v]) 

      for row in matrix: 
       csv_row = ','.join(row) 
       print csv_row 

else: 
    print 'usage: %s (inputfile)+' % me 
+1

Что это за «cp1251» и «cp866»? Что произойдет, если в данных есть даты? Почему он использует alist.extend ([something]) вместо alist.append (что-то)? Почему он использует ','. Join (row) вместо использования модуля csv? Ты серьезно??? –

+1

@John: Я просто скопировал пример pyexcelerator. Я думаю, что в этом примере мы читаем файл xls, а не часть поколения csv. Оно работает. Вы можете изменить и улучшить его по мере необходимости. – nosklo

+2

@nosklo: Это ** не работает **, если у вас есть даты в ваших данных. В общем случае использование pyExcelerator для записи xls-файлов скорее ** uncool **. Он не поддерживается регулярно. Релизы до кратковременного обновления службы вокруг Пасхи 2009 года имеют ошибки. Используйте xlwt (поддерживаемая fork) для записи файлов xls. Используйте xlrd для чтения xls-файлов. См. 'Http: // www.python-excel.org' –

2

В Ruby, вот код, я использую: (требуется отличная ParseExcel камень) требуют 'ParseExcel'

def excelGetSheet(worksheet) 
    sheet=Array.new 
    worksheet.each { |row| 
     if row != nil # empty row? 
     cells=Array.new 
     j=0 
     row.each { |cell| 
      cells << cell.to_s('latin1') unless cell == nil 
      j=j+1 
     } 
     sheet << cells 
     end 
    } 
    return sheet 
end 

workbook = Spreadsheet::ParseExcel.parse("MyExcelFile.xls") 
sheet1 = excelGetSheet(workbook.worksheet(0)) 

puts sheet1.inspect 
+0

Другие объяснения также можно найти здесь: http://www.codeweblog.com/parseexcel-ruby-used-to-read-excel/ – poseid

3

Это довольно поздно в игре, но я думал, что я хотел бы добавить еще один вариант с помощью Ruby, используя камень «РОО»:

 
    require 'rubygems' 
    require 'roo' 

    my_excel_file = Excelx.new("path/to/my_excel_file.xlsx") 
    my_excel_file.default_sheet = my_excel_file.sheets[2] 
    my_excel_file.to_csv("path/to/my_excel_file.csv") 
+1

И как выбрать третий лист? – Alfabravo

+1

Ах справедливой точки. Перед линией «to_csv» установите лист по умолчанию на третий лист, то есть my_excel_file.default_sheet = my_excel_file.sheets [2] – vikjam

1

С pyexcel библиотеке, вы можете сделать это:

>>> import pyexcel as p 
>>> data_sheet=p.get_sheet(file_name='/Users/jaska/Downloads/ie_data.xls', sheet_name='Data') 
>>> data_sheet.top_left() 
pyexcel sheet: 
+---------------------------------------------------------------------------------------------------------+---+---+---+------------+---+---+---+---+---+------------+---+---+---+---+---+---+ 
|                           | | | |   | | | | | |   | | | | | | | 
+---------------------------------------------------------------------------------------------------------+---+---+---+------------+---+---+---+---+---+------------+---+---+---+---+---+---+ 
| Stock Market Data Used in "Irrational Exuberance" Princeton University Press, 2000, 2005, 2015, updated | | | |   | | | | | | Cyclically | | | | | | | 
+---------------------------------------------------------------------------------------------------------+---+---+---+------------+---+---+---+---+---+------------+---+---+---+---+---+---+ 
| Robert J. Shiller                      | | | |   | | | | | | Adjusted | | | | | | | 
+---------------------------------------------------------------------------------------------------------+---+---+---+------------+---+---+---+---+---+------------+---+---+---+---+---+---+ 
|                           | | | |   | | | | | | Price  | | | | | | | 
+---------------------------------------------------------------------------------------------------------+---+---+---+------------+---+---+---+---+---+------------+---+---+---+---+---+---+ 
|                           | | | | Consumer | | | | | | Earnings | | | | | | | 
+---------------------------------------------------------------------------------------------------------+---+---+---+------------+---+---+---+---+---+------------+---+---+---+---+---+---+ 
>>> data_sheet.save_as('ie_data.csv') 

И для того, чтобы работать, вам необходимо установить:

$ pip install pyexcel 
$ pip install pyexcel-xls 

Более того, вы можете установить pyexcel-cli дополнительно и получить данные в формате CSV в одной командной строке:

$ pyexcel transcode --sheet-name 'Data' /your/home/Downloads/ie_data.xls ie_data.csv 
Смежные вопросы