Что нового

Cоздать массив данных из HTML Excel кода

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Добрый день!
Прочитал похожие темы, но они решают вопрос для конкретного случая. Мне бы хотелось получить универсальный парсер, который создаст массив нужного размера.
Имеется код в строковой переменной. В нем интересующая часть:
</HEAD>
<BODY onload=excel()>
<TABLE style="WIDTH: 450pt; TABLE-LAYOUT: fixed; mso-displayed-decimal-separator: '.'; mso-displayed-thousand-separator: ' '" id=excelTable border=0 cellSpacing=0 cellPadding=0>
<COLGROUP>
<COL></COL>
<COL align=right></COL>
<COL align=right></COL>
<THEAD>
<TR id=tHeader>
<TD style="WHITE-SPACE: nowrap" align=center>Дата</TD>
<TD style="WHITE-SPACE: nowrap" align=center>Стоимость пая, руб.</TD>
<TD style="WHITE-SPACE: nowrap" align=center>Стоимость ЧА, руб.</TD></TR></THEAD>
<TBODY>
<TR class=even>
<TD>01.03.2012</TD>
<TD x:num="852.11">852.11</TD>
<TD x:num="695369.57">695 369.57</TD></TR>
<TR class=even>
<TD>29.02.2012</TD>
<TD x:num="854.6">854.6</TD>
<TD x:num="697401.98">697 401.98</TD></TR>
<TR class=even>
<TD>28.02.2012</TD>
<TD x:num="852.42">852.42</TD>
<TD x:num="695627.04">695 627.04</TD></TR>
<TR class=even>
<TD>27.02.2012</TD>
<TD x:num="854.54">854.54</TD>
<TD x:num="697356.62">697 356.62</TD></TR>
<TR class=even>
<TD>24.02.2012</TD>
<TD x:num="849.2">849.2</TD>
<TD x:num="692999.51">692 999.51</TD></TR>
<TR class=even>
<TD>31.08.2010</TD>
<TD x:num="818.57">818.57</TD>
<TD x:num="1.000438185E7">10 004 381.85</TD></TR>
<TR class=even>
<TD>11.07.2007</TD>
<TD x:num="1023.31">1 023.31</TD>
<TD x:num="8.311109803E7">83 111 098.03</TD></TR></TBODY></TABLE></BODY></HTML>
Необходимо сначала по
Код:
<TR id=tHeader>
<TD style="WHITE-SPACE: nowrap" align=center>Дата</TD>
<TD style="WHITE-SPACE: nowrap" align=center>Стоимость пая, руб.</TD>
<TD style="WHITE-SPACE: nowrap" align=center>Стоимость ЧА, руб.</TD></TR></THEAD>
определить, что столбцов 3, и присвоить им названия согласно данным (Дата, Стоимость пая, руб. и т.д.)
Далее посчитать кол-во
Код:
<TR class=even>
Это будет кол-во строк. Таким образом, массив задать размером [кол-во строк +1(нулевая строка с названиями столбцов)][3]
Далее необходимо заполнить массив элементами
Код:
<TR class=even>
<TD>01.03.2012</TD>
<TD x:num="852.11">852.11</TD>
<TD x:num="695369.57">695 369.57</TD></TR>
причем последняя запись имеет вид
Код:
<TR class=even>
<TD>11.07.2007</TD>
<TD x:num="1023.31">1 023.31</TD>
<TD x:num="8.311109803E7">83 111 098.03</TD></TR></TBODY></TABLE></BODY></HTML>
Просто регулярными выражениями возникают нестыковки, по-скольку внешне данные оформлены похоже друг на друга, а имеет значение их расположение.

Пока я пишу скрипт, который по сути заносит всю эту строку в массив и обрабатываю. Конечно, это долго, но прикрутить рег.выражения не хватает навыков.
Помогите, пожалуйста, решить задачу.
Повторюсь, что столбцов может быть и не 3 как тут.. Буду признателен за решения или какие-нибудь блоки, которые хоть как то облегчат скрипт при помощи рег. выражений.
 
Автор
V

ViktorSPB

Новичок
Сообщения
109
Репутация
0
Вижу, что вопрос не актуален, но если у кого еще встанет такая проблема, предлагаю решение
Код:
Func _StrTableArray($sString)
	Local $aDataArray = StringSplit($sString,@CR)
	Local $aHead = _ArrayFindAll($aDataArray,"<td align",0,0,0,1)
	Local $aValue = _ArrayFindAll($aDataArray,"<tr class=""even"">",0,0,0,1)
	Local $aTargetArray[UBound($aValue)+1][UBound($aHead)]
	Local $N,$M,$sTemp

	
	For $N = 0 to UBound($aHead)-1
		$aTargetArray[0][$N] = StringRegExpReplace($aDataArray[$aHead[$N]],'(.*?)>(.*?)<(.*?)$','$2',1)
	Next

	For $N = 0 to UBound($aValue)-1
		For $M = 0 to UBound($aHead)-1
			If $M = 0 Then
				$sTemp = StringRegExpReplace($aDataArray[$aValue[$N]+$M+1],'(.*?)>(.*?)<(.*?)$','$2',1)
				$aTargetArray[$N+1][$M] = $sTemp
			EndIf
			If $M <> 0 Then $aTargetArray[$N+1][$M] = StringRegExpReplace($aDataArray[$aValue[$N]+$M+1],'(.*?)"(.*?)"(.*?)$','$2',1)+0
		Next
	Next

	Return $aTargetArray
EndFunc
 
Верх