Разбор целых чисел из текстового файла - PullRequest
0 голосов
/ 07 марта 2020

Мне удалось прочитать текстовый файл, для которого установлено значение var="file1.txt". Внутри file1.txt находится целое число, объединенное с некоторыми буквами. Я пытаюсь удалить целые числа и распечатать строки. В файле есть что-то вроде: «123h456i777». Я пытался использовать

k, _ := strconv.Atoi(path) fmt.Println(k) Однако я получаю ошибки, и мне кажется, что мне не хватает правильного синтаксиса. Есть ли другой метод синтаксического анализа, который я могу использовать в Go для удаления целых чисел из строки?

1 Ответ

0 голосов
/ 07 марта 2020

В отличие от atoi (или strtod) в C strconv. Atoi в Go не выполняется, если строка содержит что-то еще, кроме числа, например, конечные нецифровые символы. Однако найти подстроки, которые являются целыми, просто. Например:

s := "123h456i777"
var start, end int  // offsets into string of current run of digits
for start < len(s) {
    // Find end of integer
    idx := strings.IndexFunc(s[start:], func(r rune) bool { return r < '0' || r > '9' })
    if idx == -1 {
        end = len(s)
    } else {
        end = start + idx
    }
    if n, err := strconv.Atoi(s[start:end]); err != nil {
        log.Fatalln("Atoi error:", err.Error())
    } else {
        fmt.Println(n)  // *** use the integer
    }
    if idx == -1 {
        break   // end of integer is end of string
    }
    // Find start of next integer
    idx = strings.IndexFunc(s[end:], func(r rune) bool { return r >= '0' && r <= '9' })
    if idx == -1 {
        break  // no more digits found
    }
    start = end + idx
}

Обратите внимание, что это не обрабатывает -ve целых чисел (если это возможно), но это легко исправить.

...