Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Файлы большого объема html сохранить в csv, изменив структуру

Ответить
Настройки темы
Любой язык - Файлы большого объема html сохранить в csv, изменив структуру

Старожил


Сообщения: 235
Благодарности: 8

Профиль | Отправить PM | Цитировать


Добрый день. В приложении ссылки находятся три файла.
Файл 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

 

Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
героический человек »
Да чего там героического?
Как оказалось, глаза боятся, а руки делают... немного гугля, чуть-чуть ковыряния в доках и загашниках со скриптами, в итоге получилось rowspan-ы расковырять. На всё про все, час-полтора с перерывами...
Тем не менее, время обработки, всё равно, невменяемое, имхо. Для небольших таблиц сгодится, а для объемных - лучше таки воспользоваться чем-то другим...

-------
scio me nihil scire. Ѫ


Отправлено: 08:10, 02-04-2020 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Старожил


Сообщения: 235
Благодарности: 8

Профиль | Отправить PM | Цитировать


YuS_2, вчера запускал и не понимал что происходит и происходит ли что нибудь.
Сегодня еще раз запустил скрипт и ушел на полчаса. Через пол-часа смотрю, появился csv заполненный и txt, в котором узнал что парсило девять минут. Согласен что девять минут - это много.
Вывод такой: по любому парсеры быстро не работают

Отправлено: 15:02, 03-04-2020 | #22


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Парсеры всякой неудобоваримой шляпы быстро не работают.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:16, 03-04-2020 | #23


Старожил


Сообщения: 235
Благодарности: 8

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
Парсеры всякой неудобоваримой шляпы »
дам ссылку на эту тему автору темы, от которой ноги растут. Пусть примет к сведению
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:51, 03-04-2020 | #24


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: zip test1.zip
(723 байт, 1 просмотров)

Выдалось время одновременно с желанием понажимать кнопки...
Скрипт теперь "умеет" учитывать и 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-структуре.
Вдруг кому-то ещё пригодится...

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 16-04-2020 в 18:49. Причина: новая версия, немного оптимизации

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:34, 05-04-2020 | #25


Старожил


Сообщения: 235
Благодарности: 8

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
Парсеры всякой неудобоваримой шляпы »
Там этот парень еще тему открыл. Теперь парсит xmlhttps://www.planetaexcel.ru/forum/in...52525253BFID=1

Отправлено: 14:20, 05-04-2020 | #26


Deadooshka


Сообщения: 2482
Благодарности: 671

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: zip html_to_csv.zip
(1.3 Kb, 4 просмотров)

Цитата v79italya:
Сколько времени уходит на обработку файла? »
Мой jscript на регулярках за 24 секунды тот файл (14M). Зависит от процессора. Можно, конечно, и через com htmlfile, но это ж все 14М в DOM парсятся - сколько это по памяти будет?

Последний раз редактировалось Sham, 06-04-2020 в 22:23.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:49, 06-04-2020 | #27


Старожил


Сообщения: 235
Благодарности: 8

Профиль | Отправить PM | Цитировать


Цитата Sham:
jscript на регулярках за 24 секунды тот файл (14M). Зависит от процессора. Можно, конечно, и через com htmlfile, но это ж все 14М в DOM парсятся - сколько это по памяти будет? »
Не знаю сколько это по памяти)
У меня на нетбуке за 50 сек обработал. По моему, результат достаточно хороший.
Спасибо

Отправлено: 07:25, 07-04-2020 | #28


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
Скрипт теперь "умеет" учитывать и rowspan-ы, и colspan-ы, плюс немного описания »
Ещё вариант скрипта для парсинга html
http://forum.oszone.net/post-2919294.html#post2919294
- работает быстрее, т.к. принцип работы основан на внешнем модуле, по типу парсинга XML.
- парсер не зависит от встроенного парсера html в powershell, который зависит от Internet Explorer
- будет работать в Powershell Core

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 29-04-2020 в 05:58. Причина: поправлена орфография

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:43, 28-04-2020 | #29


Старожил


Сообщения: 235
Благодарности: 8

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
работает быстрее »
очень хорошо. Спасибо

Отправлено: 16:39, 29-04-2020 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Файлы большого объема html сохранить в csv, изменив структуру

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход