|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Файлы большого объема html сохранить в csv, изменив структуру |
|
|
Любой язык - Файлы большого объема html сохранить в csv, изменив структуру
|
Старожил Сообщения: 239 |
Добрый день. В приложении ссылки находятся три файла.
Файл csv - желаемый результат. Файл html - материал для обработки, приложил один, а так их несколько. Файл xlsx - получаемый результат в Excel в надстройке Power Query. Если в папке один файл html, то Power Query его обработает за минуту-пол-тары. Если скопировать пару раз этот же файл, то PQ три файла обработает за минут пять. Если же размножить до десяти, то на обработку уходит более 15 минут. Результат не очень. http://forum.oszone.net/thread-150969-4.html Глядя в этой теме как лихо скрипты расправляются с файлами csv, хотел бы решить и эту задачу, используя скрипт. То есть обработать папку с файлами html, изменив структуру данных и сохранив в csv. Возможно ли это и сколько времени потребуется на обработку? https://drive.google.com/open?id=1ob...li253cDbc-GMU_ |
|
Отправлено: 16:31, 29-03-2020 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата DJ Mogarych:
![]() Как оказалось, глаза боятся, а руки делают... немного гугля, чуть-чуть ковыряния в доках и загашниках со скриптами, в итоге получилось rowspan-ы расковырять. На всё про все, час-полтора с перерывами... Тем не менее, время обработки, всё равно, невменяемое, имхо. Для небольших таблиц сгодится, а для объемных - лучше таки воспользоваться чем-то другим... |
|
------- Отправлено: 08:10, 02-04-2020 | #21 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 239
|
Профиль | Отправить PM | Цитировать YuS_2, вчера запускал и не понимал что происходит и происходит ли что нибудь.
Сегодня еще раз запустил скрипт и ушел на полчаса. Через пол-часа смотрю, появился csv заполненный и txt, в котором узнал что парсило девять минут. Согласен что девять минут - это много. Вывод такой: по любому парсеры быстро не работают ![]() |
Отправлено: 15:02, 03-04-2020 | #22 |
fascinating rhythm Сообщения: 6626
|
Профиль | Отправить PM | Цитировать Парсеры всякой неудобоваримой шляпы быстро не работают.
|
------- Отправлено: 16:16, 03-04-2020 | #23 |
Старожил Сообщения: 239
|
Профиль | Отправить PM | Цитировать Цитата DJ Mogarych:
|
|
Отправлено: 16:51, 03-04-2020 | #24 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Выдалось время одновременно с желанием понажимать кнопки...
![]() Скрипт теперь "умеет" учитывать и rowspan-ы, и colspan-ы, плюс немного описания: script.ps1
<# .SYNOPSIS Парсер таблиц .html .Description Скрипт парсит таблицы в формате HTML и записывает данные в формате CSV - для каждой таблицы отдельный файл. Учитываются объединенные ячейки по строкам и(или) по колонкам, ROWSPAN и COLSPAN. Число колонок определяется автоматически, по тегам TH. Имена заголовков присваиваются из значений элементов TH. При отсутствии тегов TH, число колонок определяется по максимальному числу ячеек в строках, при этом наименование заголовков будет формироваться автоматически, с префиксом 'H' и с номерами по порядку. Размеры строк таблицы должны быть в пределах количества заголовков, т.е. структура таблицы должна быть правильной, в том числе, с учетом ROWSPAN и COLSPAN .Parameter Infile Обязательный: Указывается файл в котором необходимо распарсить таблицу(ы) .Parameter Outfile Необязательный: Имя для выходных файлов .csv. Указывается только имя, без расширения. К имени будет добавлен номер таблицы по порядку. .Example .\script.ps1 -Infile 'test.html' .Example .\script.ps1 -Infile 'test.html' -Outfile 'd:\folder\name_file' .Example .\script.ps1 'test.html' 'name_file' .Example .\script.ps1 .Notes Created By YuS Version: 1.02 Date: 16/04/2020 Purpose/Change: Устранение багов кода. Исключение вложенных таблиц. Version: 1.01 Date: 06/04/2020 Purpose/Change: Оптимизирован алгоритм чтения ячеек. Удален лишний цикл и буферный счетчик. Version: 1.00 Date: 05/04/2020 Purpose/Change: Первая версия .Link http://forum.oszone.net/showpost.php?p=2915883&postcount=25 #> param ( #[parameter(Mandatory=$true)] [string]$infile= 'test1.html', [string]$outfile = 'table' ) measure-command{ $html = new-object -com "HTMLFile" $html.ihtmldocument2_write($(gc $infile -raw -enc utf8)) $tables = $html.getelementsbytagname("table") # Исключение вложенных таблиц: $tables|?{($_.getelementsbytagname('table')|%{$_}).count -eq 0}|%{$n=0}{ # Обработка всех элементов TABLE, включая вложенные (вероятна ошибка структуры таблицы). # Необходимо закомментировать строку кода выше и раскомментировать эту: #$tables|%{$n=0}{ $headers = @();$n++ $tr = $_|%{$_.getelementsbytagname("tr")} if($headers = $tr|?{$_.firstchild().tagname -eq 'th'}| %{$_.getelementsbytagname("th")}|select -exp innertext){ $headers = $headers.trim() } else { $headers = 1..([linq.parallelenumerable]::max( [linq.parallelenumerable]::asparallel($tr.lastchild().cellindex) )+1)|%{"H$_"} } $rowind = ,1 * $headers.count $tr.where({$_.firstchild().tagname -eq 'td'})|%{ $row = $_.getelementsbytagname("td") | select innertext,rowspan,colspan try { $str = [ordered]@{} $k=0 foreach ($item in $row){ if ($rowind[$k] -gt 1){ while ($rowind[$k] -gt 1){ $str[$headers[$k]] = $null $rowind[$k] -= 1 $k++ } } if (($colspan = $item.colspan) -gt 1) { $str[$headers[$k]] = if($item.innertext){ $item.innertext.trim() } else {$null} if ($item.rowspan -gt 1){$rowind[$k] = $item.rowspan} $k++ while ($colspan -gt 1){ $str[$headers[$k]] = $null $colspan -=1 if ($rowind[$k] -gt 1){$rowind[$k]-=1} $k++ } } else { $str[$headers[$k]] = if($item.innertext){ $item.innertext.trim() } else {$null} if ($item.rowspan -gt 1){$rowind[$k] = $item.rowspan} $k++ } } [pscustomobject]$str } catch { write-host Разметка заголовков не соответствует размерам строк -for red write-host $_ -for cyan } } |export-csv $($outfile+"_"+$n+'.csv') -notype -enc utf8 -d ';' } } #|out-file time.txt -enc utf8 1. 2. Объемные таблицы, всё также обрабатываются не быстро. 3. Парсит все имеющиеся таблицы в dom-структуре. Вдруг кому-то ещё пригодится... |
------- Последний раз редактировалось YuS_2, 16-04-2020 в 18:49. Причина: новая версия, немного оптимизации Отправлено: 13:34, 05-04-2020 | #25 |
Старожил Сообщения: 239
|
Профиль | Отправить PM | Цитировать Цитата DJ Mogarych:
|
|
Отправлено: 14:20, 05-04-2020 | #26 |
Deadooshka Сообщения: 2517
|
Профиль | Отправить PM | Цитировать Цитата v79italya:
|
|
Последний раз редактировалось Sham, 06-04-2020 в 22:23. Отправлено: 18:49, 06-04-2020 | #27 |
Старожил Сообщения: 239
|
Профиль | Отправить PM | Цитировать Цитата Sham:
У меня на нетбуке за 50 сек обработал. По моему, результат достаточно хороший. Спасибо |
|
Отправлено: 07:25, 07-04-2020 | #28 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
http://forum.oszone.net/post-2919294.html#post2919294 - работает быстрее, т.к. принцип работы основан на внешнем модуле, по типу парсинга XML. - парсер не зависит от встроенного парсера html в powershell, который зависит от Internet Explorer - будет работать в Powershell Core |
|
------- Последний раз редактировалось YuS_2, 29-04-2020 в 05:58. Причина: поправлена орфография Отправлено: 22:43, 28-04-2020 | #29 |
Старожил Сообщения: 239
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
|
|
Отправлено: 16:39, 29-04-2020 | #30 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
2008 R2 - Синхронизация большого объема данных | zer0c0o1 | Windows Server 2008/2008 R2 | 2 | 28-10-2014 14:26 | |
EP-8HDA5J не функционирует с винчестерами большого объема. | love_fist911 | Материнские платы и память | 6 | 15-08-2011 05:52 | |
Разное - [решено] Не запускаются exe файлы большого объема. | necrospunk | Microsoft Windows 2000/XP | 6 | 24-04-2011 15:46 | |
2008 R2 - Подвисает копирование файлов большого объема из сети | ujin | Windows Server 2008/2008 R2 | 2 | 07-10-2010 12:57 | |
HDD - старый BIOS и винчестер большого объема. | Trinux | Накопители (SSD, HDD, USB Flash) | 2 | 30-05-2009 20:22 |
|