Лучший язык для анализа чрезвычайно больших файлов Excel 2007

У моего босса есть привычка выполнять запросы в наших базах данных, которые возвращают десятки тысяч строк и сохраняют их в файлах excel. Я, будучи стажером, постоянно должен писать сценарии, которые работают с информацией из этих файлов. До сих пор я пробовал VBScript и Powershell для своих потребностей в написании сценариев. Обе из них могут занимать несколько минут, чтобы выполнить даже самые простые задачи, что означало бы, что сценарий, когда он закончил, займет большую часть 8-часового рабочего дня.

Моим решением является просто написать сценарий PowerShell, который удаляет все запятые и символы новой строки из файла xlsx, сохраняет файлы .xlsx в .csv, а затем имеет программу Java, обрабатывающую сбор и вывод данных, и мой скрипт очищает файлы .csv по завершении. Это работает в считанные секунды для моего текущего проекта, но я не могу не задаться вопросом, есть ли более элегантная альтернатива для моей следующей. Какие-либо предложения?

При работе с файлами .xlsx я продолжал получать всевозможные странные ошибки.

Вот простой пример использования Apache POI для перемещения файла .xlsx . См. Также Обновление до POI 3.5, включая преобразование существующего кода Usermodel HSSF в SS Usermodel (для XSSF и 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"); } } } 

Ваша цель – сделать «преобразование данных» в ваших файлах Excel.

Чтобы решить эту проблему, я бы использовал специальный инструмент ETL (Extract Transform Load), такой как Talend Open Studio .

Вам просто нужно добавить компонент «Excel Input», компонент «Преобразование данных» и «Компонент вывода CSV». Talend ETL преобразует это функциональное описание вашей проблемы в Java-код. Наконец, вам просто нужно выполнить эту программу …

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

Если вы не хотите беспокоиться о новом языке, почему бы просто не использовать Java для всего? Удаление запятых и строк новой строки довольно тривиально в Java, и это сэкономит вам шаг.

Вы всегда должны думать о будущем своего кода …

Кто сохранит ваш сценарий в будущем? У вашей компании есть другие разработчики, знакомые с PowerShell / VBScript?

Я должен сказать, что вы должны придерживаться одного языка, который соответствует вашим потребностям (и вашей компании). Как предложил Натан, Python будет отличным выбором для создания быстрых сценариев.

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

Удачи!

Таль.

в дополнение к ответу trashgod, для больших файлов я бы предложил POI SXSSF (с POI 3.8 beta3). ( http://poi.apache.org/spreadsheet/ ) С помощью SXSSF вы можете обрабатывать большие файлы в потоках, и это поможет избежать ошибок памяти.

добавление ссылки на информацию SXSSF: http://poi.apache.org/spreadsheet/how-to.html#sxssf

Вы можете использовать Java POI для прямого доступа к .xlsx.

Если вы сохраните файл в формате CSV , вы можете использовать любой язык, на котором вы хотите его проанализировать.

Вы можете импортировать данные во встроенную базу данных – например, apache derby (или http://hsqldb.org/ ). В зависимости от характера ваших запросов, это может быть немного быстрее. Конечно, это сэкономит ваше время, если ваш босс будет часто запрашивать новые функции. Вы просто напишете большинство своих новых функций в SQL.

Если вам нужен анализ ADVANCE – помимо группировки, присоединения, фильтрации – просто используйте бесплатные инструменты для добычи, такие как Wekka *, Rapid miner (на основе Wekka, но более удобный GUI) или knime . Эти инструменты имеют очень приятные интерфейсы и предоставляют операторам чтение файлов cvs. Вы также можете запускать библиотеки quickminer и wekka внутри вашей java-программы. Если нет, пойдите для встроенной базы данных, как я предложил раньше.

Использование Apache POI – неплохая идея, но я – лично – предпочитаю использовать ее только для чтения excel перед ее загрузкой, например, в базу данных.

Что касается языка. Лучший язык, который я нашел для adhoc-задач, хорош . Это скриптовый язык на вершине Java, поэтому вы можете использовать все Java-библиотеки (POI, jdbcs, … очень удобный список) и смешивать классные классы с Java-классами.

У меня есть два варианта обработки файлов excel (.xlsx или xls). 1-Вы можете использовать apache POI api для извлечения данных из него. Теперь Apache poi улучшился и быстро.

2- Преобразовать excel, чтобы открыть xml, а затем написать файл xslt. Я думаю, что он должен работать над длинным файлом excel.

  • Использование applescript для перемещения файлов, имена которых отображаются в электронной таблице Excel
  • Скрипт Powershell перестает работать при запуске планировщика задач
  • Сценарии Windows: файл монитора на общем сервере и предупреждение при обнаруженном изменении
  • Excel VBA для сохранения имени файла как CSV и Cell Value
  • Как открыть файл csv в Microsoft Excel в Python?
  • excel vba копировать на пустые ячейки
  • Как обнаружить и выделить, если несколько слов в ячейке
  • excel vba - удалить ячейку из варианта, основанного на пробеле в другом столбце
  • excel vba - проверить, выбран ли переключатель?
  • Проверить или проверить, существует ли лист
  • VBA: Как заставить текущий курсор в VBE перейти к строке, где произошла последняя ошибка?
  • Давайте будем гением компьютера.