2009-08-07 37 views
6

de forma programada ¿Hay alguna manera simple, usando un lenguaje de scripts común (Perl/Python/Ruby) o línea de comandos, para convertir un archivo de hoja de cálculo de Excel a CSV? Específicamente, éste:Extrae datos de una hoja de cálculo Excel

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

Y específicamente la tercera hoja de la hoja de cálculo (las primeras dos son gráficos).

+0

He aquí una buena recopilación de algunos paquetes de Python junto con las descripciones de una sola línea que pueden ser útiles: http: //www.python-excel.org/ – Aalok

Respuesta

1

que puede haber encontrado una respuesta aceptable ya:

xls2csv

Pero interesados ​​en saber qué otras opciones existen, o sobre las herramientas en otros idiomas.

8

Tal xlrd hará el trabajo (en Python)

edición: Realmente debería aprender a leer las preguntas. Pero escribir csv no debería ser un gran problema, así que tal vez puedas usarlo.

+0

+1: xlrd funciona maravillosamente. –

+0

Correcto, la salida como CSV no es gran cosa. ¡Gracias! – dreeves

1

Para python, hay una serie de opciones, consulte here, here y here. Tenga en cuenta que la última opción solo funcionará en Windows con Excel instalado.

+3

Parece que pyXLreader no se ha actualizado desde 2005, tiene un error excepcional asombroso en el rastreador sourceforge (omite fracciones, todos los números se presentan como enteros) más algunos problemas más que encontré en unos minutos de jugar con él (bloqueos en grande archivos, a veces imprime "FCUKDATE" (¡no es broma!) cuando hay fechas en los datos, el tiempo empleado es al menos 6 veces el de xlrd y posiblemente O (N ** 2), la memoria utilizada es al menos 7 veces la de xlrd). ¿Lo usas mucho? –

+0

No. He usado xlrd brevemente, pero tiendo a almacenar datos como CSV y trabajo desde ahí. Tenía una reseña marcada de esos tres sitios web, así que pensé que podría ser útil. – DrAl

+1

¿Una reseña? No puedo encontrar tal cosa usando Google. Por favor, publique el enlace. –

14

Hay una biblioteca de Perl realmente buena para la lectura de xls: Spreadsheet::ParseExcel.

+0

+1 Usé esto yo mismo hace varios años; Definitivamente hizo el trabajo. – BlairHippo

1

Existen opciones para los tres idiomas. La pregunta es: ¿con cuál estás más familiarizado? Este es el lenguaje que deberías usar, seguro. Y si no está familiarizado con ninguno de los dos, esta aplicación no es realmente un gran ejemplo de selección entre los idiomas.

Opinionated P.S: si no conoce ninguno de los idiomas, simplemente aprenda Python y use xlrd.

+0

Oh, no lo quise decir como una pregunta de Language Wars ni nada. Solo necesitaba hacer esa tarea y estaba feliz de usar cualquier idioma que lo hiciera fácil. – dreeves

4

Puede usar pyexcelerator en python.

Este código (incluido en la carpeta de examples pyexcelerator como xls2csv.py) extrae todas las hojas de las hojas de cálculo y les da salida a stdout como CSV.

Puede cambiar fácilmente el código para hacer lo que quiera.

Lo bueno de pyexcelerator es que también puedes usarlo para escribir/crear archivos excel xls, sin tener Excel instalado.

#!/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

¿Qué están haciendo 'cp1251' y 'cp866' allí? ¿Qué pasará si hay fechas en los datos? ¿Por qué usa alist.extend ([algo]) en lugar de alist.append (algo)? ¿Por qué usa ','. Join (fila) en lugar de usar el módulo csv ?? ¿¿¿En serio??? –

+1

@John: Acabo de copiar el ejemplo de pyexcelerator. Creo que el objetivo del ejemplo es leer el archivo xls, no la parte generación csv. Funciona. Puede modificarlo y mejorarlo según sea necesario. – nosklo

+2

@nosklo: ** no funciona ** si tiene fechas en sus datos. En general, el uso de pyExcelerator para escribir archivos xls es más bien ** descolgado **. No se mantiene regularmente. Las versiones anteriores a la breve resurrección de mantenimiento alrededor de Pascua 2009 tienen errores. Use xlwt (una bifurcación mantenida) para escribir archivos xls. Use xlrd para leer archivos xls. Ver 'http: // www.python-excel.org' –

2

En Ruby, aquí está el código que utilizo: (requiere la excelente joya ParseExcel) requieren '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

más explicaciones también se encuentra aquí: http://www.codeweblog.com/parseexcel-ruby-used-to-read-excel/ – poseid

3

Esto es muy tarde para el juego, pero pensé que me gustaría añadir otra opción a través de Ruby utilizando la gema "Roo":

 
    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

Y cómo elegir tercero ¿hoja? – Alfabravo

+1

Ah, punto justo. Antes de la línea "to_csv", configure la hoja predeterminada en la tercera hoja, es decir, my_excel_file.default_sheet = my_excel_file.sheets [2] – vikjam

1

Con pyexcel biblioteca, puede hacer esto:

>>> 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') 

Y para que funcione, es necesario instalar:

$ pip install pyexcel 
$ pip install pyexcel-xls 

Lo que es más, puede instalar pyexcel-cli además y obtener sus datos CSV en una línea de comandos:

$ pyexcel transcode --sheet-name 'Data' /your/home/Downloads/ie_data.xls ie_data.csv 
Cuestiones relacionadas