从Golang中的文件中读取特定字符

时间:2016-08-01 05:50:06

标签: file go character

我想逐个字符地阅读文本文件,并为那些超过" H"以及超过" 8"的数字打印无效输入。  例如:我的输入是

I9,A2
A10,C3
D2,L3

输出: 所有三个

的输入无效
package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
)

func readLines(path string) ([]string, error) {
    file, err := os.Open(path)
    if err != nil {
        return nil, err
    }
    defer file.Close()
    var lines []string
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        lines = append(lines, scanner.Text())
    }
    return lines, scanner.Err()
}

func main() {
    lines, err := readLines("chessin.txt")
    if err != nil {
        log.Fatalf("readLines: %s", err)
    }
    var numLines int = len(lines)
    for i := 0; i < numLines; i++ {
        for j := 0; j < len(lines[i]); j++ {
            if j > 'H' {
                fmt.Printf("invalid input")
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您需要编辑内部循环以检查每个输入行,
并找到数字然后逗号,所以,像这个工作示例代码:

package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
    "strconv"
    "strings"
)

func readLines(path string) ([]string, error) {
    file, err := os.Open(path)
    if err != nil {
        return nil, err
    }
    defer file.Close()
    var lines []string
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        lines = append(lines, scanner.Text())
    }
    return lines, scanner.Err()
}
func checkOne(letter byte, number, i, j int) {
    if letter > 'H' {
        fmt.Printf("invalid input %q @ (%d, %d) \n", letter, i, j)
    }
    if number > 8 {
        fmt.Printf("invalid input number %d @ (%d, %d) \n", number, i, j+1)

    }
}
func main() {
    lines, err := readLines("chessin.txt")
    if err != nil {
        log.Fatalf("readLines: %s", err)
    }
    var numLines int = len(lines)
    for i := 0; i < numLines; i++ {
        line := lines[i]
        j := 0
        comma := strings.IndexByte(line, ',')
        if comma == -1 {
            log.Fatalf("comma not found at line: %d", i)
        }
        number, err := strconv.Atoi(line[j+1 : comma])
        if err != nil {
            log.Fatalf("line:%d err: %s", i, err)
        }
        checkOne(line[j], number, i, j)

        j = comma + 1
        number, err = strconv.Atoi(line[j+1:])
        if err != nil {
            log.Fatalf("line:%d err: %s", i, err)
        }
        checkOne(line[j], number, i, j)
    }
}

输入文件&#34; chessin.txt&#34;:

I9,A2
A10,C3
D2,L3

输出:

invalid input 'I' @ (0, 0) 
invalid input number 9 @ (0, 1) 
invalid input number 10 @ (1, 1) 
invalid input 'L' @ (2, 3) 

答案 1 :(得分:-1)

您可以使用字符串拆分和切片进行简化。不要读取并存储数组中的所有值,然后再次循环它们。假设第一个字符总是Caps,并且没有负值。工作示例代码如下:

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main() {
    file, err := os.Open("chessin.txt")
    if err != nil {
        fmt.Println(err)
    }
    defer file.Close()
    scanner := bufio.NewScanner(file)
    valid := []bool{}
    for scanner.Scan() {
        strs := strings.Split(scanner.Text(), ",")
        valid = append(valid, validateStrings(strs))
    }
    fmt.Println(valid)
}

func validateStrings(strs []string) bool {
    for _, str := range strs {
        char := str[0]
        num, err := strconv.Atoi(string(str[1:len(str)]))
        if err != nil {
            fmt.Println("Invalid input")
            os.Exit(1)
        }
        if char < 'A' || char > 'H' || num > 8 || num < 0 {
            return false
        }
    }
    return true
}