В AHK, как правильно использовать StrSplit, чтобы создать массив из файла CSV, а затем проанализировать его по определенным критериям? - PullRequest
0 голосов
/ 31 марта 2019

Я хочу взять CSV, который состоит из четырех частей: некоторый текст для отображения, рейтинг приоритета, длительность в мс и «время начала» в мс. Затем выберите из строк строку с наименьшим временем начала (или в случае связи - тот, который имеет наивысший приоритет).

Всякий раз, когда я пытаюсь запустить мой текущий код, он возвращает ошибку, говорящую о том, что в моей строке StrSplit есть пустой параметр.

Я попытался сделать отдельный цикл чтения, который заполняет массив, а затем использовать встроенные переменные индекса для отслеживания каждой из них.Я подозреваю, что проблема в том, что массив часто представляет собой просто набор фрагментов данных, разделенных запятыми - и наличие строки, в которой есть запятые, может вызвать проблему - поэтому возможно, что мои циклы выполняются один раз, а затем возвращает пустое разбиениесо второй попытки.

; Create empty array to be read to
StringArray := []

;~ ; Loop through CSV file and append each line to the array
Loop, Read, Gamestrings.csv
    {
        StringArray.Push(A_LoopReadLine)
    }

return

; New Table Option
;~ StringArray := Object()
;~ Loop, Read, Gamestrings.csv
    ;~ StringArray[A_Index] := StrSplit(A_LoopReadLine, ",")
;~ return

;Set up function/label
; Outerloop checks for Indices in array only if there is no active string, if there is an active string, loop portion skipped in favor of checking SplitStartTime against global counter until a string is displayed, which sets activestring to empty

StartCheck:
{
    for index, element in StringArray {
        BaseRow := StringArray[A_Index]
        SplitRow := StrSplit(BaseRow, ",",)
        SplitStartTime := SplitRow[4]
        SplitPriority := SplitRow[2]
    }
        if (CurrentLowest == false OR SplitStartTime < CurrentLowest) {
            ;Create initial Active String for comparisons
            ActiveString := StringArray[A_index]
            HighestPriority := SplitPriority
            CurrentLowest := SplitStartTime
            ActiveIndex := A_index
    }
        ;~ else if (SplitStartTime < CurrentLowest) {
            ;Replace Global Variables with current line OR could use StringArray index to point to which line should be active and save on using so many variables
            ;~ ActiveString := StringArray[A_index]
            ;~ DisplayText := SplitRow[1]
            ;~ PriorityOne := SplitRow[2]
            ;~ DisplayDuration := SplitRow[3]
            ;~ HighestPriority := SplitPriority
            ;~ CurrentLowest := SplitStartTime
    ;~ }
        else if (SplitStartTime = CurrentLowest AND HighestPriority < SplitPriority) {
            ActiveString := StringArray[A_index]
            HighestPriority := SplitPriority
            ActiveIndex := A_index

Конечная цель всего сценария - отобразить строку текста в течение определенного времени, а затем вычеркнуть ее из массива.Массив заполняется из файла CSV.Одновременно может отображаться только одна строка, поэтому у меня есть псевдо-таймер, настроенный как глобальная переменная, которая работает для этого, но не может даже проверить функциональность сценария из-за пустой ошибки параметра, которую я получаю изStrSplit line.

Я знаю, что есть другие проблемы - любая помощь приветствуется.

1 Ответ

0 голосов
/ 01 апреля 2019

Удалите лишнюю запятую в строке

SplitRow := StrSplit(BaseRow, ",",)

Итак, должно быть

SplitRow := StrSplit(BaseRow, ",")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...