Тема: 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

