Golang проблема с построчным перебором при парсинге лога nginx

Имеется файл на несколько гигабайт. для поиска нужной информации нужно производить сравнение текущей строки со всеми последующими. Помещение файла в память полностью - проблемно из-за объема файла. C go почти не знаком. Получился такой код. Отрабатывает корретно только частично. Т.е выводит нужные данные в нужном формате, но почему-то не все. прикладываю часть кода для фильтрации

for fileScanner.Scan() {
        text := fileScanner.Text()
        splitText := strings.Split(text, " ")
        ip_first := splitText[0]
        WriteMap[ip_first] = 1
        date_first := splitText[1]
        c1 := 1
        c2 := 1
        //повторно бежим по файлу начиная с индекса c2>c1
        for fileScanner.Scan() {
            //считаем только значения с индексом выше c1
            if c2 <= c1 {
                c2++
                continue
            } else {
                //полуаем знаения для сравнения
                text = fileScanner.Text()
                splitText := strings.Split(text, " ")
                ip_second := splitText[0]
                date_second := splitText[1]
                method_second := splitText[4]
                codeResponse_second := splitText[7]

                //старт сравнения.
                if comparator(date_first, date_second) {
                    if comparator(ip_first, ip_second) {
                        if method_second == "GET" {
                            if codeResponse_second == "200" {
                                WriteMap[ip_first]++
                            }
                        }
                    }
                }
                //В случае комментария else-части - код полностью перестает работать. Выводит пустую карту. без комментирования работает, но считает явно не все
                // else {
                //  break
                // }
                c2++
            }
        }
        c1++
    }
    return WriteMap, nil
}

//тупо для удобства
func comparator(a string, b string) bool {
    if a == b {
        return true
    } else {
        return false
    }

Возможно ли этот код заставить работать корректно?


Ответы (1 шт):

Автор решения: ar rr
for fileScanner.Scan() {

        text := fileScanner.Text()
        splitText := strings.Split(text, " ")

        ip_first := splitText[0]
        date_first := splitText[1]
        date_first = date_first[1:]

        if WriteMap[date_first+" "+ip_first] < 1 {
            WriteMap[date_first+" "+ip_first] = 1
        }

        // method_first:= splitText[4]
        // codeResponse_first:= splitText[7]
        c1 := 1
        c2 := 1
        get200 = 0
        for fileScanner.Scan() {
            if c2 <= c1 {
                c2++
                continue
            } else {

                //полуаем знаения для сравнения
                text = fileScanner.Text()
                splitText := strings.Split(text, " ")
                ip_second := splitText[0]
                date_second := splitText[1]
                method_second := splitText[4]
                codeResponse_second := splitText[7]

                //старт сравнения.
                if comparator(date_first, date_second) {
                    if comparator(ip_first, ip_second) {
                        if method_second == "GET" {
                            if codeResponse_second == "200" {

                                WriteMap[date_first+" "+ip_first]++

                            }

                        }
                    }
                } else {

                    break
                }
                c2++
            }
            c1++
        }

    }
    return WriteMap, nil
}

проблема оказалась в перезаписи значений внутри цикла.

if codeResponse_second == "200" {

WriteMap[date_first+" "+ip_first]++

}
``` Значения повторялись и перезаписывались. Текущий код - работает корректно. 
→ Ссылка