如何在读取文件时删除golang中的特殊字符?

时间:2016-02-01 03:11:36

标签: go

我有这样的文件: Each line represents a Website

1 www.google.com$
2 www.apple.com$
3 www.facebook.com$

我在golang中读到它:

type ListConf struct {
    File  string
    Datas map[string]struct{}
}

func loadListConf(conf *ListConf, path string) {
    file, err := os.Open(path + "/" + conf.File)
    if err != nil {
        fmt.Println("Load conf " + conf.File + " error: " + err.Error())
        return
    }
    defer file.Close()
    conf.Datas = make(map[string]struct{})
    buf := bufio.NewReader(file)
    end := false
    for !end {
        line, err := buf.ReadString('\n')
        if err != nil {
            if err != io.EOF {
                fmt.Println("Load conf " + conf.File + " error: " + err.Error())
                return
            } else {
                end = true
            }
        }
        item := strings.Trim(line, "\n")
        if item == "" {
            continue
        }
        conf.Datas[item] = struct{}{}
    }
}

但是,当我在地图中搜索“www.google.com”等关键字时,会显示地图中没有“www.google.com”。

website := "www.google.com"
if _, ok := conf.Datas[website]; ok {
    fmt.Printf("%s is in the map.", website)
} else {
    fmt.Printf("%s is not in the map.", website)
}

打印“www.google.com不在地图中”。 我在地图中的每个键的末尾发现了一个^ M,我的问题是如何删除^ M字符?

www.google.com^M
www.apple.com^M
www.facebook.com^M

2 个答案:

答案 0 :(得分:4)

Windows上文本文件中的默认行分隔符是两个字符的序列:\r\n。您在字符串中看到的^M字符为\r

bufio.Scanner可以通过独立于平台的方式将输入拆分为行:

scanner := bufio.NewScanner(file)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
    fmt.Fprintln(os.Stderr, "error reading from the file:", err)
}

答案 1 :(得分:2)

不太优雅,但......

您可以使用以下内容从字符串末尾删除\r

line, err := buf.ReadString('\n') line = strings.TrimRight(line, "\r")

它将删除多个\r(^ M),如果没有,则为无操作。