文件names.txt由许多名称组成,格式为:
"KELLEE","JOSLYN","JASON","INGER","INDIRA","GLINDA","GLENNIS"
有谁知道如何分割字符串,以便用逗号分隔各个名称?
KELLEE,JOSLYN,JASON,INGER,INDIRA,GLINDA,GLENNIS
以下代码按逗号分隔,并在名称两边加上引号,什么是转义字符以分隔出"。可以在一个Split语句中完成,拆分","并用逗号分隔吗?
"
","
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
杰里米(Jeremy)的回答基本上是正确的,并且完全符合您的要求。但是,“ 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) }