Что нового

[Массивы] Сортировка данных многомерного массива и запись в файл

A

at

Гость
Здравствуйте Всем! Никак не получается подружиться с массивом, а точнее не могу понять, как работать с данным массивом.

Из Get-запроса http://www.finam.ru/scripts/export.js получаем данные. В каждой строке массива 8214 элемента, и это значение имеет динамический характер.
Каждому значению в массиве var aEmitentMarkets=new Array(20,11....) соответствуют значения из других массивов данного запроса. Нужно записать эти данные в текстовый файл и рассортировать их в определенном порядке. Должна получиться примерно следующая запись в файле:

Сектор 1 ($a_Emitent_Ids = '12')
Строка 1 | $a_Emitent_Ids | $a_Emitent_Names | $a_Emitent_Codes | $a_Emitent_Markets'
Строка 2 | $a_Emitent_Ids | $a_Emitent_Names | $a_Emitent_Codes | $a_Emitent_Markets'
... и т.д.
Сектор 2 ($a_Emitent_Ids = '25')
Строка 1 | $a_Emitent_Ids | $a_Emitent_Names | $a_Emitent_Codes | $a_Emitent_Markets'
Строка 2 | $a_Emitent_Ids | $a_Emitent_Names | $a_Emitent_Codes | $a_Emitent_Markets'
... и т.д.
Сектор 3 ($a_Emitent_Ids = '17')
Строка 1 | $a_Emitent_Ids | $a_Emitent_Names | $a_Emitent_Codes | $a_Emitent_Markets'
Строка 2 | $a_Emitent_Ids | $a_Emitent_Names | $a_Emitent_Codes | $a_Emitent_Markets'
... и т.д.

P.S. В прикрепленном *txt-файле примерно то, что требуется получить из обработки Get-запроса.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
at

Как-то так (особо не проверял):

Код:
#NoTrayIcon
#include <Array.au3>

$sText = FileRead('export.js')
$aResult1 = _StringSplitRegExp($sText, '(new Array\()|(\);)')

$aResult2 = StringSplit($aResult1[2], ',')
$aResult4 = StringSplit($aResult1[4], ',')
$aResult6 = StringSplit($aResult1[6], ',')
$aResult8 = StringSplit($aResult1[8], ',')

Dim $avArray[$aResult2[0] + 1][4]

For $i = 1 To $aResult2[0]
	$avArray[$i][0] = $aResult2[$i]
	$avArray[$i][1] = $aResult4[$i]
	$avArray[$i][2] = $aResult6[$i]
	$avArray[$i][3] = $aResult8[$i]
Next

_ArraySort($avArray, 1, 1, 0, 3)
$sText = ''
$iK = -1

;_ArrayDisplay($avArray)

$File = FileOpen('1.txt', 1) ; файл

For $i = 1 To UBound($avArray) - 1

	If ($iK <> $avArray[$i][3] And $iK <> -1) Or $i = UBound($avArray) - 1 Then
		FileWrite($File, '[' & _Market($avArray[$i - 1][3]) & ']' & @CRLF & StringReplace($sText, "'", ''))
		$sText = ''
	EndIf

	$iK = $avArray[$i][3]
	$sText &= $avArray[$i][2] & '=' & $avArray[$i][0] & ',' & $avArray[$i][1] & @CRLF
Next

FileClose($File)

Func _Market($index)
	Local $sMarket = $index

	Switch $index
		Case 1
			$sMarket = 'ММВБ Акции'
		Case 29
			$sMarket = 'ММВБ ПИФы'
			;Case 8 ; и т.д

	EndSwitch
	Return ($sMarket)
EndFunc   ;==>_Market

Func _StringSplitRegExp($sString, $sPattern, $sIncludeMatch = False, $iCount = 0)
	Local $sReservedPattern = Chr(0)
	Local $sReplacePattern = $sReservedPattern
	If $sIncludeMatch Then $sReplacePattern = "$0" & $sReplacePattern
	$sTemp = StringRegExpReplace($sString, $sPattern, $sReplacePattern, $iCount)
	If StringRight($sTemp, 1) = $sReservedPattern Then $sTemp = StringTrimRight($sTemp, 1)
	$aResult = StringSplit($sTemp, $sReservedPattern, 1)
	Return $aResult
EndFunc   ;==>_StringSplitRegExp



Замечу только, что для скачки тикеров с этого сайта есть готовые решения
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Мой вариант.
Код:
Local $sIniName = @ScriptDir & '\finam_export.ini'

_Export($sIniName)

#Region Function

Func _Export($s_IniName)
	
	Local $o_JS = ObjCreate("MSScriptControl.ScriptControl.1")
    If Not IsObj($o_JS) Then Return SetError(1, 0, 0)
	$o_JS.Language = "jscript"
	
	Local $a_VarName[5] = ['aEmitentIds', 'aEmitentNames', 'aEmitentCodes', 'aEmitentMarkets', 'aDataFormatStrs']

		 
	Local $a_Emitent[18][3] = _ 
		[['ММВБ Акции', 1], _
		 ['ММВБ ПИФы', 29], _
		 ['ММВБ облигации', 2], _
		 ['ММВБ Внесписочные облигации', 12], _	 
		 ['РТС', 3], _
		 ['РТС-GAZ', 10], _
		 ['РТС-GTS', 11], _
		 ['RTS Board', 20], _
		 ['Фьючерсы ФОРТС', 14], _
		 ['Forex', 5], _ 
		 ['Мировые Индексы', 6], _
		 ['Фьючерсы США', 7], _
		 ['Расписки', 8], _
		 ['Товары', 24], _
		 ['СПФБ Архив', 9], _
		 ['ФОРТС Архив', 17], _
		 ['ММВБ Архив', 16], _
		 ['РТС Архив', 18]]
		
	Local $s_Data = InetRead('http://www.finam.ru/scripts/export.js')	
	
	$o_JS.AddCode(BinaryToString($s_Data))

	For $i = 0 To $o_JS.Eval($a_VarName[3] &'.length') -1
		Switch Number($o_JS.Eval($a_VarName[3] &'['& $i &']'))
			Case $a_Emitent[0][1]		
				$a_Emitent[0][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
			Case $a_Emitent[1][1]
				$a_Emitent[1][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
			Case $a_Emitent[2][1]
				$a_Emitent[2][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
			Case $a_Emitent[3][1]
				$a_Emitent[3][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF
			Case $a_Emitent[4][1]
				$a_Emitent[4][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
			Case $a_Emitent[5][1]
				$a_Emitent[5][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
			Case $a_Emitent[6][1]
				$a_Emitent[6][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
			Case $a_Emitent[7][1]
				$a_Emitent[7][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
			Case $a_Emitent[8][1]
				$a_Emitent[8][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
			Case $a_Emitent[9][1]
				$a_Emitent[9][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
			Case $a_Emitent[10][1]
				$a_Emitent[10][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
			Case $a_Emitent[11][1]
				$a_Emitent[11][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
			Case $a_Emitent[12][1]
				$a_Emitent[12][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
			Case $a_Emitent[13][1]
				$a_Emitent[13][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
			Case $a_Emitent[14][1]
				$a_Emitent[14][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
			Case $a_Emitent[15][1]
				$a_Emitent[15][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
			Case $a_Emitent[16][1]
				$a_Emitent[16][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
			Case $a_Emitent[17][1]
				$a_Emitent[17][2] &= $o_JS.Eval($a_VarName[2] &'['& $i &']') &'='& $o_JS.Eval($a_VarName[0] &'['& $i &']') &','& $o_JS.Eval($a_VarName[1] &'['& $i &']') & @LF 
		EndSwitch
		
	Next
	
	For $i = 0 To UBound($a_Emitent) -1
		$s_Data = StringTrimRight($a_Emitent[$i][2], 1)
		IniWriteSection($s_IniName, $a_Emitent[$i][0], $s_Data)
	Next

	Return SetError(0, 0, 1)	
EndFunc ;==>_Export

#EndRegion Function

P.S. Большая к вам просьба, прочитать этот пост!
 
Верх