Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / perl и чтение из xlsx файлов / 20 сообщений из 20, страница 1 из 1
29.11.2014, 15:19
    #38820285
evgen25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
Делаю чтение xlsx файлов из программы написанной на perl, через модуль spreadsheet::xlsx. Но при чтении файлов свыше 100мб начинаются проблемы. программа сьедает всю доступную оперативную память и начинает активно использовать своп. на компьютере установлено 16Гб оперативной памяти и 20 гб swap. на компьютере стоит линукс. может кто то сталкивался с такой проблемой. может кто то посоветует другой модуль. так как последная версия этого модуля 0.13 и датирована 2010 годом.
...
Рейтинг: 0 / 0
29.11.2014, 15:39
    #38820293
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
Другой модуль для парсинга xlsx целиком не подскажу, не в теме. Но если ничего не удастся найти, тогда можно попробовать распаковать файл (xlsx - это zip-архив с несколькими файлами XML) и попытаться обработать каждый его компонент в отдельности (или только нужный). Вроде было даже что-то для парсинга XML без загрузки его целиком в память.
...
Рейтинг: 0 / 0
29.11.2014, 16:15
    #38820308
evgen25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
vkle,

не знаю как там всё устроено, но почему то, ячейки с английскими символами там есть, а с кириллицей нет. тем более это не очень удачный вариант когда сотню файлов обработать надо. вообщем, хотелось бы что б кто то опытом поделился.
...
Рейтинг: 0 / 0
29.11.2014, 21:30
    #38820402
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
evgen25,

Spreadsheet::ParseXLSX

This module internally uses XML::Twig, which makes it potentially subject to Bug #71636 for XML-Twig: Segfault with medium-sized document on perl versions 5.14 and below (the underlying bug with perl weak references was fixed in perl 5.15.5). The larger and more complex the spreadsheet, the more likely to be affected, but the actual size at which it segfaults is platform dependent. On a 64-bit perl with 7.6gb memory, it was seen on spreadsheets about 300mb and above.

This software is Copyright (c) 2014 by Jesse Luehrs.
...
Рейтинг: 0 / 0
30.11.2014, 12:04
    #38820604
evgen25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
volodin661,

это значит что мне перл надо обновить не ниже версии 5.15.5?
...
Рейтинг: 0 / 0
30.11.2014, 16:11
    #38820725
nexoma
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
1. попробуй java-технологии

вот пример на scala с библиотекой POI,
чтобы особо не мучится, брось библиотеку poi в lib-каталог scala или java
ничего компилить не надо, обычный скриптовой язык.

2. либо предложенный вариант с распаковкой zip-архива xlsx и дальнейшей работой в виде xml и xpath
примеры гуглятся.

3. прим., если ты в линуксе, лучше не апгрейдить perl, а инсталлировать новый локально в /usr/local/bin


package me.eax.poi_example

import java.io._
import org.apache.poi.ss.util._
import org.apache.poi.xssf.usermodel._

object ReportTemplateWriter extends App {
// Данные для построения отчета
val months = Array("октябрь 2012", "ноябрь 2012", "декабрь 2012",
"январь 2013", "февраль 2013", "март 2013")
val data = Map(
(1,"RU-CENTER") -> Array(83318, 80521, 83048, 73638, 82014, 93982),
(2,"REGRU") -> Array(35621, 37013, 36515, 41595, 45042, 49101),
(3,"R01") -> Array(44155, 44356, 43199, 39629, 42754, 48528),
(4,"REGTIME") -> Array(19999, 18587, 18630, 18627, 19886, 20496)
)

// Открываем шаблон отчета
val wb = new XSSFWorkbook(
getClass.getResourceAsStream("/template.xlsx")
)
val sheet = wb.getSheetAt(0)

// Заполняем шапку таблицы
val headerRow = sheet.getRow(0)
for(idx <- 1 to months.size) {
headerRow.getCell(idx).setCellValue(months(idx - 1))
}

// Заполняем тело таблицы
for(key @ (rowNumber, rowName) <- data.keys) {
val row = sheet.getRow(rowNumber)
row.getCell(0).setCellValue(rowName)
for(idx <- 1 to data(key).size) {
row.getCell(idx).setCellValue(data(key)(idx - 1))
}
}

// Также нужно заполнить подвал, иначе он не пересчитается
val footerRow = sheet.getRow(data.size + 1)
for(idx <- 1 to months.size) {
val cell = footerRow.getCell(idx)
val range = new CellRangeAddress(1, data.size, idx, idx)
cell.setCellFormula(s"SUM(${range.formatAsString})")
}

// Сохраняем отчет
val resultFile = new FileOutputStream("report.xlsx")
wb.write(resultFile)
resultFile.close
}
...
Рейтинг: 0 / 0
30.11.2014, 16:57
    #38820746
evgen25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
nexoma,

мне ничего не надо записывать, просто чтение xlsx файлов. версия perl - 5.14.2
...
Рейтинг: 0 / 0
30.11.2014, 18:02
    #38820772
evgen25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
модуль Spreadsheet::ParseXLSX через полтора часа прочитал файл. скорость работы ..............
...
Рейтинг: 0 / 0
30.11.2014, 19:28
    #38820819
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
evgen25скорость работы ..............Угу. Давно уже заметил, что как-то неторопливо разбирается XML "нормальными" парсерами. Думаю, это из-за необходимости построения дерева в целях универсальности применения. Может статься, что под конкретную задачу выковыривания только нужных данных из файла с заранее точно известной структурой проще свой парсер написать, без построения дерева.
...
Рейтинг: 0 / 0
30.11.2014, 19:55
    #38820832
evgen25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
vkle,

ради эксперемента засек время за сколько оба модуля обработают файл. итог не утешителен:
...
Рейтинг: 0 / 0
30.11.2014, 19:56
    #38820833
evgen25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
spreadsheet::xlsx - 8 минут
...
Рейтинг: 0 / 0
30.11.2014, 19:56
    #38820834
evgen25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
Spreadsheet::ParseXLSX - 1 час 10 минут.
извините что тремя сообщениями.
...
Рейтинг: 0 / 0
01.12.2014, 10:59
    #38821130
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
evgen25,

теоретически можно переписать Spreadsheet::ParseXLSX,
используя вместо парсер-модуля XML::Twig модуль XML::Fast, который быстрее,
но кто это будет делать? )
...
Рейтинг: 0 / 0
01.12.2014, 15:47
    #38821489
evgen25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
volodin661,

а можно ли в парсере менять формат данных на лету? как в экселе меня в колонке тип данны (числовой. текстовый и т.д.)
...
Рейтинг: 0 / 0
01.12.2014, 16:49
    #38821596
evgen25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
тоже уже подумал о том что модуль под другую библиотеку переписать, только кто сопровождать это потом будет, да и что то не очень получается со структурой экселевского документа разобраться
...
Рейтинг: 0 / 0
01.12.2014, 18:56
    #38821804
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
evgen25,

парсер парсером, а сама задача-то какая?
...
Рейтинг: 0 / 0
08.12.2014, 16:17
    #38828205
evgen25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
volodin661,

данные из xlsx файла положить в базу данных.
...
Рейтинг: 0 / 0
08.12.2014, 17:29
    #38828293
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
evgen25данные из xlsx файла положить в базу данных.Вариант конвертнуть на стороне Екселя эти XLSX в формат CSV не рассматривается? Чтобы его потом напрямую затащить в базу чем-то вроде LOAD DATA INFILE .
...
Рейтинг: 0 / 0
08.12.2014, 23:14
    #38828482
kunaksergey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
Может стоит обратить своё внимание на Xslt
...
Рейтинг: 0 / 0
09.12.2014, 07:29
    #38828572
evgen25
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
perl и чтение из xlsx файлов
vkle,

сначало по пробовал в текстовый формат с табулящией, нашлись свои особенности. потом по пробовал csv, пока проблем не выявлено. хотел без всяких там конвертирования данных обойтись. но похоже адекватного решения не найти
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / perl и чтение из xlsx файлов / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]