Что нового

Как считать тхт файл в массив

joker2d

Новичок
Сообщения
182
Репутация
0
Есть txt файл в котором сначала идет имя параметра, потом значение
tovar=stol
count=3
tovar=stul
count=2

Нужно получить массив на autoit чтобы он был в таком виде, имя параметра это ключ в массиве, потом порядковый номер и значение параметра из тхт
Код:
$array[tovar][0]=stol
$array[tovar][1]=stul
$array[count][0]=3
$array[count][1]=2


как это сделать ?
 

SealAlbinos

Продвинутый
Сообщения
154
Репутация
57
Код:
$hFile = FileOpen("file.txt", 0)
$txt = FileRead($hFile)

$tovar = StringRegExp($txt, 'tovar=(.*)', 3)
$count = StringRegExp($txt, 'count=(.*)', 3)

if IsArray($tovar) and IsArray($count) then
    if UBound($tovar) = UBound($count) then
        Global $array[]
        Global $TovarMap[]
        Global $CountMap[]
        for $i = 0 to UBound($tovar) - 1
            $TovarMap[$i] = $tovar[$i]
            $CountMap[$i] = $count[$i]
        Next

        $array.Tovar  = $TovarMap
        $array.Count  = $CountMap

        MsgBox(0, "", $array["Tovar"][0] & @CRLF & $array["Count"][0])
        MsgBox(0, "", $array.Tovar[1] & @CRLF & $array.Count[1])
    Else
        MsgBox(0,"Ошибка","количество значений не совпадает")
    EndIf
Else
    MsgBox(0,"Ошибка","не удалось получить данные")
EndIf

Я в map не очень, но как вариант
 
Последнее редактирование:

All2khoff

Продвинутый
Сообщения
351
Репутация
65
по сути у вас указан принцип работы с ini файлом... посмотрите информацию по работе с этим типом файлов.
Код:
IniRead
 

SealAlbinos

Продвинутый
Сообщения
154
Репутация
57
по сути у вас указан принцип работы с ini файлом... посмотрите информацию по работе с этим типом файлов.
Код:
IniRead
с одной стороны и да и нет, если использовать функционал ini, то тогда придется делать проверку на "tovar" и "count" и разделять их друг от друга (если делать так, как хочет автор).
По этой причине как по мне вариант с ini более обширный, нежели простая регулярка
 
Автор
J

joker2d

Новичок
Сообщения
182
Репутация
0
с одной стороны и да и нет, если использовать функционал ini, то тогда придется делать проверку на "tovar" и "count" и разделять их друг от друга (если делать так, как хочет автор).
По этой причине как по мне вариант с ini более обширный, нежели простая регулярка
Да IniRead как я понял не очень гибкий, решил все через массивы, чуть по другому но идея та же, читается строка и в зависимости от ключа заноситься в тот или другой массив
 

Alecsis

Осваивающий
Сообщения
101
Репутация
41
Joker2d, а Вам принципиально заполучить разбивку данных именно на 2 «параллельных» массива (точнее получается, map-а)?
Если что, можно обойтись одним 2-мерным массивом. М.б. не так концептуально, как у SealAlbinos, зато не надо связываться с map-ами, к-рые вроде бы и есть, но в оф/справке по ним грозное предупреждение в красной рамке, что это скользкая фича…
На всякий случай вот ещё вариант с «классикой»
Код:
Opt('MustDeclareVars', True)
; ──────────────
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
#include <array.au3>
; ──────────────
Local _
  $hFile, $sData,   _ ; хендл и содержимое файла
  $aTemp, $iPairs,  _ ; вспомог. массив для StringRegExp и счётчик пар значений tovar и count
  $aTemp, $iPairs,  _ ; вспомог. массив для StringRegExp
  $aInfo,           _ ; 2-мерный массив собранных пар tovar/count
  $i

$hFile = FileOpen('file.txt')
If ($hFile = -1) Then
  MsgBox($MB_ICONSTOP, @ScriptName, 'Облом открытия файла')
  Exit 1
EndIf
$sData = FileRead($hFile)
FileClose($hFile)

Local Const $csREx = '(?isU)tovar=([^\x0D\x0A]+)\s+count=(\d+?)' ; разбор текста из файла по парам

$aTemp  = StringRegExp($sData, $csREx, $STR_REGEXPARRAYGLOBALMATCH)
If @error Then  ;
  MsgBox($MB_ICONSTOP, @ScriptName, 'Что-то не так с содержимым файла')
  Exit 2
EndIf
_ArrayDisplay($aTemp, 'Результат StringRegExp')

$iPairs = UBound($aTemp)/2              ; кол-во корректных пар
Dim $aInfo[$iPairs][2]                   ; 2-мерный массив-результат
For $i = 0 To $iPairs-1
  $aInfo[$i][0]  = $aTemp[2*$i]
  $aInfo[$i][1]  = $aTemp[2*$i+1]
Next
_ArrayDisplay($aInfo, 'Рез-т разбора по парам')
Exit
 

VanGer

Новичок
Сообщения
1
Репутация
0
Добрый день!
Вижу что тема не закрыта, решил добавить свои 5 копеек ))
Если я правильно понял постановку задачи, то использованием ключей Вы как-то интересно вы решили перемешать массивы и объекты.
По сути вы хотите получить массив объектов. Можно, только мне не очень понятно зачем...
По-моему работать с этим не очень удобно, проще работать с одним ассоциативным массивом (рекомендую к прочтению Объект Scripting.Dictionary)
Но хозяин-барин... код прилагаю.
В отличие от первого предложенного кода не будет полного отказа при любой неточности во входном файле, а на выходе получим все адекватно заведенные пары значений.

Код:
#include 'File.au3'
#include 'Array.au3'

Global $aFile[1], $Array[1], $Object[1]
;содержимое файла сразу в массив - так удобнее
_FileReadToArray('file.txt',$aFile)
;проверка на получение достаточного минимального количества строк из файла
If UBound($aFile)<3 Then Exit 1
   
;заполняем массив объектами
For $i=1 to UBound($aFile)-2
   If StringLeft($aFile[$i],5)=='tovar' And StringLeft($aFile[$i+1],5)=='count' Then 
      $Object=ObjCreate("Scripting.Dictionary")
      $Object.Add('tovar',StringTrimLeft($aFile[$i],6))
      $Object.Add('count',StringTrimLeft($aFile[$i+1],6))
      _ArrayAdd($Array,$Object)
      $Object=0
   EndIf
Next
;убираем лишний первозданный элемент массива
_ArrayDelete($Array,0)

; вывод в консоль содержимое массива для проверки
For $i=0 To UBound($Array)-1
  ConsoleWrite(@crlf&$Array[$i].Item('tovar')&@TAB&$Array[$i].Item('count'))
Next
 
Верх