Что нового

Чтение файла в массив

Revenant

Новичок
Сообщения
13
Репутация
0
Есть функция _FileReadToArray, она построчно считывает файл. Я сохранял файл через _FileWriteFromArray использовался двухмерный массив, однако при чтении я получил одномерный. Пример
a[0][0] =1 a[0][1] =2
a[1][0] =3 a[1][1] =4
Получил
a[0]= 1 2
a[1]= 3 4
Как в результате чтения получить первый вариант. Может как-то поработать над строками, если они явно будут разделены " " или каким-нибудь специальным символом, например "l". Подскажите.
 

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
я бы сделал так
Код:
#include <array.au3>

Local $array[3][2], $array_new[0][2], $file = @ScriptDir & '\1.txt'
$array[0][0] = 1
$array[0][1] = 2
$array[1][0] = 3
$array[1][1] = 4
$array[2][0] = 5
$array[2][1] = ''

_ArrayDisplay($array, 'Исходный массив')
FileWriteFromArray($file, $array)
File_ReadToArray($file, $array_new)
_ArrayDisplay($array_new, 'Чтение из файла')

Func FileWriteFromArray($spath, $sarray)
	Local $fo = FileOpen($spath,1)
	For $i = 0 To UBound($sarray) - 1
		FileWriteLine($spath, $sarray[$i][0])
		FileWriteLine($spath, $sarray[$i][1])
	Next
	FileClose($fo)
EndFunc   ;==>FileWriteFromArray

Func File_ReadToArray($spath_f, ByRef $sarray_f)
	Local $line = 1, $index = 0, $line_n = 2, $col = 1
	Local $fo = FileOpen($spath_f)
	While 1
		$frl = FileReadLine($spath_f, $line)
		If @error = -1 Then
			FileClose($fo)
			Return
		EndIf
		$frl_n = FileReadLine($spath_f, $line_n)
		If @error = -1 Then
			FileClose($fo)
			Return
		EndIf
		ReDim $sarray_f[$col][2]
		$sarray_f[$index][0] = $frl
		$sarray_f[$index][1] = $frl_n
		$line += 2
		$index += 1
		$line_n += 2
		$col += 1
	WEnd
EndFunc   ;==>FileReadToArray
скорее всего, это сугубо для данного варианта. входящий массив - двумерный. исходящий - такой же. использовал версию AutoIT 3.3.10.2. она позволяет создавать пустой массив(без строк)
 
Автор
R

Revenant

Новичок
Сообщения
13
Репутация
0
error: FileReadToArray() [built-in] called with wrong number of args.
что-то с размерностью, да и вроде по сохраненному файлу не то что мне надо. желательно оставить запись в формате
1 2
3 4
вот кажется то что надо http://autoit-script.ru/index.php/topic,5618.0.html только я с регулярными выражениями не дружу...
 

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
Revenant [?]
error: FileReadToArray() [built-in] called with wrong number of args.
да. забыл. в новой версии языка эта функция уже нативная..
поправил(смотри мой предыдущий пост)
насчет файла..я так понял, что файл ты открывать не будешь в редакторе..а просто записывать в него из массива и читать из него в массив. поэтому неважно в каком формате произведена запись в файл. главное как это в массиве потом отобразится..
или нет?




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

с регулярными тоже особо не дружу
но можно такой вариант
Код:
#include <array.au3>
Local $array[3][2], $array_new[0][2], $file = @ScriptDir & '\1.txt'
$array[0][0] = 1
$array[0][1] = 2
$array[1][0] = 3
$array[1][1] = 4
$array[2][0] = 5
$array[2][1] = 6

_ArrayDisplay($array, 'Исходный массив')
FileWriteFromArray($file, $array)
File_ReadToArray($file, $array_new)
_ArrayDisplay($array_new, 'Чтение из файла')

Func FileWriteFromArray($spath, $sarray)
	Local $fo = FileOpen($spath,1)
	For $i = 0 To UBound($sarray) - 1
		FileWriteLine($spath, $sarray[$i][0] & '|' & $sarray[$i][1])
	Next
	FileClose($fo)
EndFunc   ;==>FileWriteFromArray

Func File_ReadToArray($spath_f, ByRef $sarray_f)
	Local $line = 1, $index = 0, $col = 1
	Local $fo = FileOpen($spath_f)
	While 1
		$frl = FileReadLine($spath_f, $line)
		If @error = -1 Then
			FileClose($fo)
			Return
		EndIf
		$strsplt = StringSplit($frl,'|',2)
		ReDim $sarray_f[$col][2]
		$sarray_f[$index][0] = $strsplt[0]
		$sarray_f[$index][1] = $strsplt[1]
		$line += 1
		$index += 1
		$col += 1
	WEnd
EndFunc   ;==>File_ReadToArray
в файле будет такой формат записи
1|2
3|4
почему не использовал функцию
Код:
_FileWriteFromArray()

при каждой записи она стирает содержимое файла
в моем варианте записи добавляются. если не нужно добавлять, а просто заменять старую запись новой, то тогда можно так
Код:
#include <array.au3>
#include <file.au3>
Local $array[3][2], $array_new[0][2], $file = @ScriptDir & '\1.txt'
$array[0][0] = 1
$array[0][1] = 2
$array[1][0] = 3
$array[1][1] = 4
$array[2][0] = 5
$array[2][1] = 6

_ArrayDisplay($array, 'Исходный массив')
_FileWriteFromArray($file, $array)
File_ReadToArray($file, $array_new)
_ArrayDisplay($array_new, 'Чтение из файла')

Func File_ReadToArray($spath_f, ByRef $sarray_f)
	Local $line = 1, $index = 0, $col = 1
	Local $fo = FileOpen($spath_f)
	While 1
		$frl = FileReadLine($spath_f, $line)
		If @error = -1 Then
			FileClose($fo)
			Return
		EndIf
		$strsplt = StringSplit($frl,'|',2)
		ReDim $sarray_f[$col][2]
		$sarray_f[$index][0] = $strsplt[0]
		$sarray_f[$index][1] = $strsplt[1]
		$line += 1
		$index += 1
		$col += 1
	WEnd
EndFunc   ;==>File_ReadToArray
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Не люблю 2 и более мерные массивы, поэтому всегда стараюсь использовать плоский (одномерный) вариант:
Код:
; Для массива [2][3]
Global $arr[2*3]
; Заполняем
For $i = 0 To UBound($arr)-1
	$arr[$i] = $i+1
Next
; Выводим [0][1] - 2
ConsoleWrite($arr[0*3+1] & @CRLF)
; Выводим [1][1] - 5
ConsoleWrite($arr[1*3+1] & @CRLF)

Здесь "3" размер второго элемента двухмерного массива.
 

paulgator

Новичок
Сообщения
8
Репутация
1
Для двумерных массивов произвольного размера использовал для записи _FileWriteFromArray2D:
Код:
;==========================================================================================================================================
; Function:			_FileWriteFromArray2D($FILEPATH, $ARRAY [, $iROWstart=0 [, $iROWend=0 [, $iCOLstart=0 [, $iCOLend=0 [, $DELIM='|']]]]])
;
; Description:      Write 1D/2D array to file, 2D with delimiter between every entry
; 
; Parameter(s):     $FILEPATH	- path/filename of the file to be write
;                   $ARRAY		- array to write from
;      optional     $iROWstart	- start row-index, default 0
;      optional     $iROWend	- end row-index, default Ubound(array)-1
;      optional     $iCOLstart	- start column-index, default 0
;      optional     $iCOLend	- end column-index, default Ubound(array,2)-1
;      optional     $DELIM		- delimiter for 2D-array entries, default '|'
;
; Requirement(s):   None
;
; Return Value(s):  On Success - Returns -1
;                   On Failure - Returns 0 and sets @error = 1 (given array is'nt array); @error = 2 (unable to open filepath)
;
; Note:				If $iROWstart > $iROWend or $iCOLstart > $iCOLend the values will be swapped among
;
; Author(s):        BugFix ( [email protected] )
;==========================================================================================================================================
Func _FileWriteFromArray2D($FILEPATH, $ARRAY, $iROWstart=0, $iROWend=0, $iCOLstart=0, $iCOLend=0, $DELIM='|')
	Local $tmp
	If Not IsArray($ARRAY) Then
		SetError(1)
		Return 0
	EndIf
	Local $Ubound = UBound($ARRAY)
	If $iROWend = 0 Then $iROWend = $Ubound-1
	Local $fh = FileOpen($FILEPATH, 2)
	If $fh = -1 Then
		SetError(2)
		Return 0
	EndIf
	Select
	Case $iROWstart < 0 Or $iROWstart > $Ubound-1
		$iROWstart = 0
		ContinueCase
	Case $iROWend < 0 Or $iROWend > $Ubound-1
		$iROWend = $Ubound-1
		ContinueCase
	Case $iROWstart > $iROWend
		$tmp = $iROWstart
		$iROWstart = $iROWend
		$iROWend = $tmp
	EndSelect
	Local $Ubound2nd = UBound($ARRAY, 2)
	If @error = 2 Then
		For $i = $iROWstart To $iROWend
			FileWriteLine($fh, $ARRAY[$i])
		Next
	Else
		If $iCOLend = 0 Then $iCOLend = $Ubound2nd-1
		Select
		Case $iCOLstart < 0 Or $iCOLstart > $Ubound2nd-1
			$iCOLstart = 0
			ContinueCase
		Case $iCOLend < 0 Or $iCOLend > $Ubound2nd-1
			$iCOLend = $Ubound2nd-1
			ContinueCase
		Case $iCOLstart > $iCOLend
			$tmp = $iCOLstart
			$iCOLstart = $iCOLend
			$iCOLend = $tmp
		EndSelect

		For $i = $iROWstart To $iROWend
			$tmp = ''
			For $k = $iCOLstart To $iCOLend
				If $k < $iCOLend Then
					$tmp &= $ARRAY[$i][$k] & $DELIM
				Else
					$tmp &= $ARRAY[$i][$k]
				EndIf
			Next
			FileWriteLine($fh, $tmp)
		Next
	EndIf
	FileClose($fh)
	Return -1
EndFunc ;==>_FileWriteFromArray2D

а для чтения _FileReadToArray2D:
Код:
;==========================================================================================================================================
; Function:			_FileReadToArray2D($FILEPATH, $ARRAY [, $DELIM=-1])
;
; Description:      Read 1D/2D array from file, if $DELIM is given (<> -1) 2D array will created
; 
; Parameter(s):     $FILEPATH	- path/filename of the file to read in an array
;                   $ARRAY		- array variable to hold readed data
;      optional     $DELIM		- delimiter for 2D-array entries, default -1 (none 2D-array)
;
; Requirement(s):   None
;
; Return Value(s):  On Success - Returns -1
;                   On Failure - Returns 0 and sets @error = 1 	(given file are not seperated with given delimiter or count of delimiters 
;								 are not equal); @error = 2 (unable to open filepath)
;
; Note:				If given file is delimited to create 2D-array ALL lines need the same count of delimiters, otherwise an error occurs!
;
; Author(s):        BugFix ( [email protected] )
;==========================================================================================================================================
Func _FileReadToArray2D($FILEPATH, ByRef $ARRAY, $DELIM=-1)
	Local $fh = FileOpen($FILEPATH, 0), $line, $var, $n = 1
	If $fh = -1 Then
		SetError(2)
		Return 0
	EndIf
	If $DELIM <> -1 Then
		$line = FileReadLine($fh, 1)
		$var = StringSplit($line, $DELIM)
		If IsArray($var) Then
			Local $Ubound2nd = $var[0]
			Local $AR[1][$Ubound2nd]
			$AR[0][0] = 0
		Else
			SetError(1)
			Return 0
		EndIf
		While 1
			$line = FileReadLine($fh, $n)
			If @error = -1 Then ExitLoop
			$var = StringSplit($line, $DELIM)
			If IsArray($var) Then
				ReDim $AR[UBound($AR)+1][$Ubound2nd]
				For $i = 0 To $Ubound2nd-1
					$AR[UBound($AR)-2][$i] = $var[$i+1]
				Next
			Else
				SetError(1)
				Return 0
			EndIf
			$n += 1
		Wend
		ReDim $AR[UBound($AR)-1][$Ubound2nd]
	Else
		Local $AR[1]
		$AR[0] = 0
		While 1
			$line = FileReadLine($fh, $n)
			If @error = -1 Then ExitLoop
			ReDim $AR[UBound($AR)+1]
			$AR[UBound($AR)-2] = $line
			$n += 1
			ReDim $AR[UBound($AR)-1]
		WEnd
		ReDim $AR[UBound($AR)-1]
	EndIf
	FileClose($fh)
	$ARRAY = $AR
	Return -1
EndFunc ;==>_FileReadToArray2D

В качестве разделителя использую "|"; если нужно, то данные потом удобно импортируются в Excel для обработки.
 
Верх