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

не знаю как там всё устроено, но почему то, ячейки с английскими символами там есть, а с кириллицей нет. тем более это не очень удачный вариант когда сотню файлов обработать надо. вообщем, хотелось бы что б кто то опытом поделился.
...
Рейтинг: 0 / 0
perl и чтение из xlsx файлов
    #38820402
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
perl и чтение из xlsx файлов
    #38820604
evgen25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
volodin661,

это значит что мне перл надо обновить не ниже версии 5.15.5?
...
Рейтинг: 0 / 0
perl и чтение из xlsx файлов
    #38820725
Фотография nexoma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
perl и чтение из xlsx файлов
    #38820746
evgen25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nexoma,

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

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

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

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

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

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

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


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