13

文件 names.txt 包含许多名称,格式如下:

"KELLEE","JOSLYN","JASON","INGER","INDIRA","GLINDA","GLENNIS"

有谁知道如何拆分字符串,以便它是用逗号分隔的各个名称?

KELLEE,JOSLYN,JASON,INGER,INDIRA,GLINDA,GLENNIS

以下代码用逗号分隔并在名称周围留下引号,拆分出来的转义字符是什么"。可以在一个拆分语句中完成,拆分","并留下逗号分隔吗?

package main

import "fmt"
import "io/ioutil"
import "strings"

func main() {
        fData, err := ioutil.ReadFile("names.txt")  // read in the external file
    if err != nil {
        fmt.Println("Err is ", err)     // print any error
    }
    strbuffer := string(fData)  // convert read in file to a string

    arr := strings.Split(strbuffer, ",")

    fmt.Println(arr)

}

顺便说一句,这是 Project Euler 问题 #22 的一部分。http://projecteuler.net/problem=22

4

2 回答 2

18

杰里米的回答基本上是正确的,并且完全符合您的要求。但是“names.txt”文件的格式实际上是众所周知的,称为CSV(逗号分隔值)。幸运的是,Go 附带了一个encoding/csv包(它是标准库的一部分),用于轻松解码和编码这些格式。除了您的 + Jeremy 的解决方案之外,如果格式无效,此包还将给出准确的错误消息,支持多行记录并正确取消引用字符串的引用。

基本用法如下所示:

package main

import (
    "encoding/csv"
    "fmt"
    "io"
    "os"
)

func main() {
    file, err := os.Open("names.txt")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    defer file.Close()
    reader := csv.NewReader(file)
    for {
        record, err := reader.Read()
        if err == io.EOF {
            break
        } else if err != nil {
            fmt.Println("Error:", err)
            return
        }

        fmt.Println(record) // record has the type []string
    }
}

还有一种ReadAll方法可能会使您的程序更短,假设整个文件都适合内存。

更新: dystroy 刚刚指出您的文件无论如何只有一行。CSV 阅读器也适用于此,但以下不太通用的解决方案也应该足够了:

for {
    if n, _ := fmt.Fscanf(file, "%q,", &name); n != 1 {
        break
    }
    fmt.Println("name:", name)
}
于 2012-07-13T07:15:38.650 回答
9

拆分不会从子字符串中删除字符。您的拆分很好,您只需要在之后使用 strings.Trim(val, "\"") 处理切片。

for i, val := range arr {
  arr[i] = strings.Trim(val, "\"")
}

现在 arr 将删除前导和尾随 "s。

于 2012-07-13T01:41:19.867 回答