2010-08-24 13 views
5

Mi jefe tiene la costumbre de realizar consultas en nuestras bases de datos que devuelven decenas de miles de filas y las guardan en archivos de Excel. Yo, como pasante, constantemente tengo que escribir guiones que funcionen con la información de estos archivos. Hasta ahora, he probado VBScript y Powershell para mis necesidades de scripting. Ambos pueden tardar varios minutos en realizar incluso las tareas más sencillas, lo que significa que el script, una vez terminado, tomaría la mayor parte de un día de 8 horas.Mejor lenguaje para analizar archivos extremadamente grandes de Excel 2007

Mi solución ahora es simplemente escribir un script de PowerShell que elimine todas las comas y los caracteres de nueva línea de un archivo xlsx, guarde los archivos .xlsx en .csv y luego haga que un programa Java maneje la recopilación y salida de datos y hacer que mi script elimine los archivos .csv cuando haya terminado. Esto se ejecuta en cuestión de segundos para mi proyecto actual, pero no puedo evitar preguntarme si existe una alternativa más elegante para mi próximo proyecto. ¿Alguna sugerencia?

+1

¿Puede abrir Excel en los archivos y pedirle a Excel que haga lo que necesita? –

+0

Bueno, eso es básicamente lo que se hace ahora. Un montón de vlookups y mesas pivotantes que traen una máquina de núcleo i7 de alta gama con 8 GB de ram de rodillas. – arcdrag

+0

¿Esto es de alguna utilidad? Vi una demostración y parece ser rápida: http://www.powerpivot.com/demo.aspx Le permite analizar rápidamente millones de filas en Excel, los resultados interactivos se pueden agregar a Sharepoint e incluso se pueden volver a Informes Servicios para un análisis posterior. – Fionnuala

Respuesta

5

Obtuve todo tipo de errores extraños al trabajar con archivos .xlsx.

Aquí está un ejemplo sencillo del uso Apache POI para atravesar un archivo .xlsx. Consulte también Upgrading to POI 3.5, including converting existing HSSF Usermodel code to SS Usermodel (for XSSF and HSSF).

import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.DateUtil; 
import org.apache.poi.ss.usermodel.FormulaEvaluator; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.Workbook; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class XlsxReader { 

    public static void main(String[] args) throws IOException { 
     InputStream myxls = new FileInputStream("test.xlsx"); 
     Workbook book = new XSSFWorkbook(myxls); 
     FormulaEvaluator eval = 
      book.getCreationHelper().createFormulaEvaluator(); 
     Sheet sheet = book.getSheetAt(0); 
     for (Row row : sheet) { 
      for (Cell cell : row) { 
       printCell(cell, eval); 
       System.out.print("; "); 
      } 
      System.out.println(); 
     } 
     myxls.close(); 
    } 

    private static void printCell(Cell cell, FormulaEvaluator eval) { 
     switch (cell.getCellType()) { 
      case Cell.CELL_TYPE_BLANK: 
       System.out.print("EMPTY"); 
       break; 
      case Cell.CELL_TYPE_STRING: 
       System.out.print(cell.getStringCellValue()); 
       break; 
      case Cell.CELL_TYPE_NUMERIC: 
       if (DateUtil.isCellDateFormatted(cell)) { 
        System.out.print(cell.getDateCellValue()); 
       } else { 
        System.out.print(cell.getNumericCellValue()); 
       } 
       break; 
      case Cell.CELL_TYPE_BOOLEAN: 
       System.out.print(cell.getBooleanCellValue()); 
       break; 
      case Cell.CELL_TYPE_FORMULA: 
       System.out.print(cell.getCellFormula()); 
       break; 
      default: 
       System.out.print("DEFAULT"); 
     } 
    } 
} 
+0

Estoy recibiendo errores de memoria cuando el libro se inicializa en su código al pasar las más de 30 hojas de cálculo que estoy ordenando. Sin embargo, parece funcionar bien para archivos más pequeños. Creo que voy a seguir con mi método actual por ahora. Sin embargo, voy a tener esto en cuenta para archivos más pequeños. – arcdrag

+0

@ user429997: Cuando llegue el momento, puede aumentar la memoria asignada a Java utilizando las opciones '-Xms' y' -Xmx'. – trashgod

+0

Véase también 'DataFormatter', ilustrado [aquí] (http://stackoverflow.com/a/30062075/230513). – trashgod

1

Puede usar Java POI para acceder al .xlsx directamente.

+0

Lo intenté hoy, y no me pareció tan intuitivo como todo el mundo lo hace sonar. No tuve problemas para trabajar con archivos .xls, pero seguí recibiendo todo tipo de errores extraños al trabajar con archivos .xlsx. – arcdrag

2

Yo personalmente usaría Python para esto. Descubrí que funciona lo suficientemente rápido como para no ser un problema notable.

Si no desea preocuparse por un nuevo idioma, ¿por qué no utilizar Java para todo? La eliminación de comas y líneas nuevas es bastante trivial en Java y le ahorraría un paso.

+0

Por lo que he visto Java o Python es mi mejor opción. El problema que he tenido hasta ahora es interactuar con un archivo .xlsx, que no he podido hacer fácilmente con Java. Podría darle una oportunidad a Python en algún momento de esta semana si no hago más progresos con el POI de apache. Es bastante trivial con PowerShell, pero me gustaría limitarlo a un único idioma si es posible. – arcdrag

3

Su objetivo es hacer "transformación de datos" en sus archivos de Excel.

Para resolver esto, utilizaría una herramienta ETL dedicada (Extraer carga de transformación), como Talend Open Studio.

Solo tiene que poner un componente "Entrada de Excel", un componente de "transformación de datos" y un "componente de salida CSV". Talend ETL convertirá esta descripción funcional de su problema en un código Java. Por último, sólo hay que ejecutar este programa ...

+0

No he tenido mucha suerte con Talend y archivos de Excel "grandes", p. 10k líneas o más. Obtención de OutOfMemoryErrors –

2

Siempre se debe pensar en el futuro de su código ...

que mantendrán su script en el futuro? ¿Su empresa tiene otros desarrolladores que estén familiarizados con PowerShell/VBScript?

Tendría que decir que debe apegarse a un idioma que se adapte a sus necesidades (y las de su empresa). Como sugirió Nathan, Python sería una gran opción para crear scripts rápidos.

Y una cosa más: si puede controlar las instrucciones SQL que hace su jefe, puede hacer que cree salidas que facilitarán el desarrollo de su analizador sintáctico y las harán mucho más simples.

¡Buena suerte!

Tal.

1

Si guarda el archivo como CSV, puede usar cualquier idioma que desee analizar.

0

Puede importar datos a una base de datos incrustada, por ejemplo, apache derby (o http://hsqldb.org/). Dependiendo de la naturaleza de sus consultas, puede ser un poco más rápido. Sin duda, le ahorrará mucho tiempo si su jefe solicita nuevas funciones a menudo. Simplemente escribirá la mayor parte de su nueva funcionalidad en SQL.

0

Si necesita un análisis ADVANCE - más allá de la agrupación, unión, filtrado -, sólo tiene que ir para disfrutar de herramientas gratuitas mineras, tales como Wekka *, Rapid minero (basado en GUI Wekka pero mejor), o knime. Estas herramientas tienen interfaces muy agradables y proporcionan operadores para leer archivos cvs. También puede ejecutar las bibliotecas rapidminer y wekka dentro de su programa java. De lo contrario, vaya a la base de datos incrustada tal como lo propuse anteriormente.

El uso de Apache POI no es una mala idea, pero yo personalmente prefiero usarlo solo para leer Excel antes de cargarlo en, por ejemplo, una base de datos.

En cuanto al idioma. El mejor lenguaje que he encontrado para tareas adhoc es groovy. Es un lenguaje de scripting en la parte superior de Java para que puedas usar todas las libs de Java (POI, jdbcs, ... una lista muy larga) y mezclar clases groovy con clases de Java.

0

Tengo dos opciones para el análisis de Excel (.xlsx o xls) archivos. 1-Puede utilizar la API api de apache para extraer datos de ella. Ahora, el poi de Apache ha mejorado y es rápido.

2- Convierte Excel para abrir xml y luego escribe un archivo xslt. Creo que debería funcionar para un archivo de Excel de archivo largo.

Cuestiones relacionadas