13

ファイル names.txt は、次の形式の多くの名前で構成されています。

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

コンマで区切られた個々の名前になるように文字列を分割する方法を知っている人はいますか?

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

次のコードはカンマで分割し、名前の周りに引用符を残します..を分割するエスケープ文字は何ですか". ","分割してカンマを残して、1 つの 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 problem # 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 は、とにかくあなたのファイルが 1 行しかないことを指摘しました。CSV リーダーはこれにも適していますが、次の一般的ではない解決策でも十分です。

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

Splitは、サブストリングから文字を削除しません。分割は問題ありません。後でstrings.Trim(val、 "\" ")を使用してスライスを処理する必要があります。

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

これで、arrの先頭と末尾の「」が削除されます。

于 2012-07-13T01:41:19.867 に答える