1

Тема: AHK: Запись в массив из строки

Доброго.

Запутался с массивами. Пробовал разные варианты, все где-то рядом, но не то.

Есть строка вида:


мусор, мусор, мусор, [A] Остров, Имя, Количество, Цена, [A] Остров, ...., Цена и т.д.

Надо записать в ассоциативный массив все элементы "Остров, Имя, Количество, Цена", в таком виде:


Array := [{Island: "123", Name: "test", quantity: 11, price: 197}
		, {Island: "2", Name: "bla", quantity: 505, price: 16600}
		, ...]

Сейчас у меня сортирует и записывает, но не правильно. Из того что я пробывал, либо записывает в многомерный массив, либо в ассоциативный но только с одной ключ парой.


FileEncoding, UTF-8
FileRead, ni, ni.txt
Aluminum_arr := []

Array_temp := StrSplit(ni, ",")

For Key, Value in Array_temp
{
	if InStr(Value, "["[A-Z]"]") {
		arr_index += 1
		Aluminum_arr[arr_index] := ({Island: Value})
			Continue
	}
	if (arr_index >= 1) {
		temp_index += 1
			if (temp_index == 2) {
				Array := StrSplit(Value, "\t")
				Aluminum_arr[arr_index] := ({quantity: Array[2]})
				price_temp := RegExReplace(Array[3], "[^\d]", "")
				Aluminum_arr[arr_index] := ({price: price_temp})
				temp_index := 0
					Continue
			}
			Aluminum_arr[arr_index] := ({name: Value})
	}
}

Return
; Пропускаю мусор, записываю Остров
; После Острова записываю имя, количество и цену
; Дальше опять Остров

Хотя бы в теории, как правильно добавлять в нужном мне виде в массив?

GD

2

Re: AHK: Запись в массив из строки

Непонятно, как должен выглядеть созданный массив, и по какому принципу он должен создаваться.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: Botsy, 2022-11-16 18:19:26)

Re: AHK: Запись в массив из строки

teadrinker Из такой строки:


мусор, мусор, мусор, [A] Самоа, Петя, 25, 400, [A] Крит, Вася, 40, 16600 и т.д.

В такой массив:


Array := [{Island: "[A] Самоа", Name: "Петя", quantity: 25, price: 400}
		, {Island: "[A] Крит", Name: "Вася", quantity: 40, price: 16600}
		, ...]
GD

4

Re: AHK: Запись в массив из строки

Если я правильно понял, то так:

str := "мусор, мусор, мусор, [A] Самоа, Петя, 25, 400, [A] Крит, Вася, 40, 16600 и т.д."
keys := ["Island", "Name", "quantity", "price"]
arr := []

m := ""
while RegExMatch(str, "O)(\[A].+?),\s*(.+?),\s*(\d+),\s*(\d+)", m, m ? m.Pos + m.Len : 1) {
   obj := {}
   for k, v in keys
      obj[v] := m[k]
   arr.Push(obj)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Запись в массив из строки

teadrinker Круто. Только не понял почему в массив всё нормально добавляется и после 1-ого индекса с четырьмя парами ключ-значение, идет второй индекс, в котором тоже четыре пары ключ-значение. И они не перезаписывают друг друга. В какой момент массив "arr" понимает, что надо добавлять второй индекс и т.д.?

GD

6

Re: AHK: Запись в массив из строки

Читайте про методы массива, Push().

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Запись в массив из строки

teadrinker Я пробовал через пуш, поэтому и спросил. Когда я делал, он просто перезаписывал значения, а не добавлял новые.

Типо такого:


str := "[A] Самоа, Петя, 25, 400, [A] Крит, Вася, 40, 16600"
keys := ["Island", "Name", "quantity", "price"]
arr := []
Array_temp := StrSplit(str, ",")

Loop, 2
{
	temp := A_index
	obj := {}
	For K, V in keys
	{
		if (temp == 1) {
			obj[V] := Array_temp[K]
		}
		else {
			obj[V] := Array_temp[K + 4]
		}
		arr.push(obj)
	}
}

MsgBox, % arr[1]["Island"] . " + " arr[2]["Island"]

Выводиться будет одинаковое название: [A] Самоа + [A] Самоа. Хотя должно же [A] Самоа + [A] Крит

GD

8

Re: AHK: Запись в массив из строки

Push не в том месте.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder