Что нового

Нужна функция дампа 2 мерного массива

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Версия AutoIt: 3.неважно

Описание:
Должна сохранять существующий двумерный массив в таком виде, что бы его можно было вставить обратно в скрипт. Например результат работы:
Код:
Global $aTest[2][2] = [[FALSE,2],['Тест',"Тест с ' ковычкой"]]

можно добавить разделение строк.

Примечания:
В массиве числа и TRUE/FALSE не должны быть преобразованы в строку.
 

beliy

Продвинутый
Сообщения
372
Репутация
72
если правильно понял то можно так попробовать:

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

; размер массива
$aX = 2 
$aY = 2

Global $aTest[$aX][$aY] = [[FALSE,2],["Тест","Тест с ' ковычкой"]]
_ArrayDisplay($aTest, "Глобальный массив")
$sFile = @ScriptDir & "\array.txt"

_FileWriteFromArrayEx($sFile, $aTest, 0)

Dim $Array [$aX][$aY]
$ft = FileOpen($sFile, 0)

If $ft = -1 Then
    MsgBox(0, "Error", "Невозможно открыть файл.")
    Exit
EndIf

$p = 1 
for $m = 0 to $aX 
    $t = FileReadLine($ft, $p)
    $s =StringSplit($t,'|')
    For $n = 1 to $s[0] -1
        $Array[$m][$n-1] = $s[$n + 1]
    Next
    $p += 1
    ConsoleWrite(@LF)
Next
_ArrayDisplay($Array)
FileClose($ft)

Func _FileWriteFromArrayEx($File, $a_Array, $i_Base = 0, $i_UBound = 0, $s_Delim = "|") ; правленая функция с File.au3
	; Check if we have a valid array as input
	If Not IsArray($a_Array) Then Return SetError(2, 0, 0)
	Local $iDims = UBound($a_Array, 0)
	If $iDims > 2 Then Return SetError(4, 0, 0)

	; determine last entry
	Local $last = UBound($a_Array) - 1
	If $i_UBound < 1 Or $i_UBound > $last Then $i_UBound = $last
	If $i_Base < 0 Or $i_Base > $last Then $i_Base = 0

	; Open output file for overwrite by default, or use input file handle if passed
	Local $hFile
	If IsString($File) Then
		$hFile = FileOpen($File, $FO_OVERWRITE)
	Else
		$hFile = $File
	EndIf
	If $hFile = -1 Then Return SetError(1, 0, 0)

	; Write array data to file
	Local $ErrorSav = 0
	Switch $iDims
		Case 1
			For $x = $i_Base To $i_UBound
				If FileWrite($hFile, $a_Array[$x] & @CRLF) = 0 Then
					$ErrorSav = 3
					ExitLoop
				EndIf
			Next
		Case 2
			Local $s_Temp
			For $x = $i_Base To $i_UBound
				$s_Temp = $a_Array[$x][0]
				For $y = 0 To $iDims-1 ; было For $y = 1 To $iDims
					$s_Temp &= $s_Delim & $a_Array[$x][$y]
				Next
				If FileWrite($hFile, $s_Temp & @CRLF) = 0 Then
					$ErrorSav = 3
					ExitLoop
				EndIf
			Next
	EndSwitch

	; Close file only if specified by a string path
	If IsString($File) Then FileClose($hFile)

	; Return results
	If $ErrorSav Then Return SetError($ErrorSav, 0, 0)
	Return 1
EndFunc   ;==>_FileWriteFromArray
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Нет, нужно как то так:
Код:
Global $aTest[3][2] = [[False, 2],['Тест', 0],['2', 'Текст']]
$vRet = _array2dump($aTest, '_CORE')
$hAr = FileOpen('array_save.au3',2)
FileWrite($hAr,'#include-once'&@CRLF&$vRet)
FileClose($hAr)

Func _array2dump(ByRef $a_array, $sName = 'aTest')
	Local $vVal = ''
	Local $iRow = UBound($a_array, 1)
	Local $iCol = UBound($a_array, 2)
	Local $sOut = 'Global $' & $sName & '[' & $iRow & '][' & $iCol & '] = ['
	For $irow_index = 0 To $iRow - 1
		$sOut &= '['
		For $icol_index = 0 To $iCol - 1
			$vVal = $a_array[$irow_index][$icol_index]
			Select
				Case IsString($vVal)
					$sOut &= "'" & StringReplace($vVal,"'","''") &"'"
				Case IsNumber($vVal) Or IsBool($vVal)
					$sOut &= $vVal
				Case Else
					$sOut &= "''";
			EndSelect
			$sOut &= ','
		Next
		$sOut = StringTrimRight($sOut, 1)
		$sOut &= '], _ ' & @CRLF
	Next
	$sOut = StringTrimRight($sOut, 6)
	$sOut &= ']'
	Return $sOut
EndFunc   ;==>_array2dump

Здесь еще нужно сделать разбивку строки если она получается слишком большой.


Добавлено:
Сообщение автоматически объединено:

Экранирование сделано
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Должна сохранять существующий двумерный массив в таком виде, что бы его можно было вставить обратно в скрипт
Уточните где именно планируется хранить эти данные перед обратной вставкой?
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Тему будем считать решенной. Можно заняться оптимизацией. Вот окончательный вариант с примером:
Код:
Global $aTest[3][2] = [[False, 2],['Тест', 0],['2', 'Текст']]
$vRet = _array2dump($aTest, '_CORE')
$hAr = FileOpen('array_save.au3',2)
FileWrite($hAr,'#include-once'&@CRLF&$vRet)
FileClose($hAr)

Func _array2dump(ByRef $a_array, $sName = '_CORE')
	Local $vVal = ''
	Local $iRow = UBound($a_array, 1)
	Local $iCol = UBound($a_array, 2)
	Local $sOut = 'Global $' & $sName & '[' & $iRow & '][' & $iCol & '] = ['
	For $irow_index = 0 To $iRow - 1
		$sOut &= '['
		For $icol_index = 0 To $iCol - 1
			$vVal = $a_array[$irow_index][$icol_index]
			Select
				Case IsString($vVal)
					$sOut &= "'" & StringReplace($vVal,"'","''") &"'"
				Case IsNumber($vVal) Or IsBool($vVal)
					$sOut &= $vVal
				Case Else
					$sOut &= "'"&$vVal&"'";
			EndSelect
			$sOut &= ','
		Next
		$sOut = StringTrimRight($sOut, 1)
		$sOut &= '], _ ' & @CRLF
	Next
	$sOut = StringTrimRight($sOut, 6)
	$sOut &= ']'
	Return $sOut
EndFunc   ;==>_array2dump
 
Верх