1 (изменено: KusochekDobra, 2016-12-13 03:05:50)

Тема: AHK: Object.HasKey() => Разобрался

Добра всем читающим!
Поделитесь пожалуйста мудростью. Пишу в текстовом файле "data.txt" строчку наобум:


N78NU6BNKJ,LJN&Y,7JBY6,097hbKU,NNNNNNNY

Сохраняю в UTF-8. Затем хочу получить первый набор символов до запятой в параметр 'key' для ассоциированного массива, а остальные в параметр для этого ключа, который будет массивом:


collectionData:=GetCollectionData("data.txt")
a:=""
for w, e in collectionData
{
	a:=% "key = " w "`n`nValues:`n"
	while (A_Index<=e.Length())
		a:=% a e[A_Index] "`n"
}
MsgBox,, Title, % a "`n`n HasKey(N78NU6BNKJ) = " collectionData.HasKey("N78NU6BNKJ")
GetCollectionData(readFile) {
	collection:={},itemsArr:=[]
	file:=FileOpen(readFile, "r", "UTF-8")
	file.Seek(0)
	strItems:=StrSplit(file.ReadLine(),",","`r`n")
	if (strItems.Length()<2)
		return
	file.Seek(0)
	while (file.Tell()<file.Length) {
		itemsArr:=StrSplit(file.ReadLine(),",","`r`n")
		i:=2,collection[itemsArr[1]]:=[],totalDatacount++
		while (i<=itemsArr.Length()) {
			collection[itemsArr[1]].Push(itemsArr[i])
			i++
		}
	}
	file.Close()
	return collection
}

МесседжБокс выводит результат, в котором в его понимании нет такого ключа. Переделал в двумерный массив:


collectionData:=GetData("data.txt")
totalStr:=""
i:=2,j:=1
while (j<=collectionData.Length()) {
	while (i<=collectionData[j].Length()) {
		totalStr:=% totalStr "Key=" collectionData[j][1] "; Val=" collectionData[j][i] "`n"
		i++
	}
	j++
}
MsgBox,, Title, % totalStr
if (collectionData[1][1] == "N78NU6BNKJ")
	MsgBox,, Title, TRUE
else
	MsgBox,, Title, % "'" collectionData[1][1] "'`n'N78NU6BNKJ'`n" CheckString(collectionData[1][1], "N78NU6BNKJ") "`n`nStrLen(arr) => " StrLen(collectionData[1][1]) " StrLen(str) => " StrLen("N78NU6BNKJ")

GetData(readFile) {
	dataArr:=[]
	file:=FileOpen(readFile, "r", "UTF-8")
	file.Seek(0)
	strItems:=StrSplit(file.ReadLine(),",","`r`n")
	if (strItems.Length()<2)
		return
	file.Seek(0)
	while (file.Tell()<file.Length) {
		dataArr.Push(StrSplit(file.ReadLine(),",","`r`n"))
	}
	file.Close()
	return dataArr
}
CheckString(mainStr, srchStr) {
	if mainStr contains %srchStr%
		return true
	return false
}

И так же, данные из ячейки [1][1] не соответствуют "N78NU6BNKJ", в то время как проверка на содержание в этой ячейки строки "N78NU6BNKJ" возвращают единицу. =/
Не понимаю, как так. Где у этого велосипеда поломка?

Обновлено:
В последнем примере, StrLen() - показывает разное количество символов, 11 и 10 соответственно. В то время как текст заключённый в одинарные кавычки идентичен.

Обновлено 2:
Как оказалось, такой эффект вызывает перемещение указателя в начало файла:


file.Seek(0)

Переделал проверку на размер файла, убрав это перемещение в начало и заработало. Вместо:


	file.Seek(0)
	strItems:=StrSplit(file.ReadLine(),",","`r`n")
	if (strItems.Length()<2)
		return
	file.Seek(0)

Это:


	if (file.Length<2)
		return

Всем, кто дочитал до этого места плюс в карму! Будье внимательны и не напрягайте голову перед сном! xD