1. ホーム
  2. go

[解決済み] テキストファイルを文字列配列に読み込む(そして書き込む)

2022-10-30 10:25:05

質問

テキストファイルを文字列配列に読み書きする機能は、かなり一般的な要件であると思います。それはまた、最初にデータベースにアクセスする必要性を排除して、言語を始めるときに非常に便利です。Golangにはあるのでしょうか?

e.g.

func ReadLines(sFileName string, iMinLines int) ([]string, bool) {

func WriteLines(saBuff[]string, sFilename string) (bool) { 

重複するよりも、既存のものを使いたい。

どのように解決するのですか?

Go1.1 リリース時点では bufio.Scanner という API があり、ファイルから簡単に行を読み取ることができます。 上記の例をScannerで書き直した次のような例を考えてみましょう。

package main

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

// readLines reads a whole file into memory
// and returns a slice of its lines.
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()
}

// writeLines writes the lines to the given file.
func writeLines(lines []string, path string) error {
    file, err := os.Create(path)
    if err != nil {
        return err
    }
    defer file.Close()

    w := bufio.NewWriter(file)
    for _, line := range lines {
        fmt.Fprintln(w, line)
    }
    return w.Flush()
}

func main() {
    lines, err := readLines("foo.in.txt")
    if err != nil {
        log.Fatalf("readLines: %s", err)
    }
    for i, line := range lines {
        fmt.Println(i, line)
    }

    if err := writeLines(lines, "foo.out.txt"); err != nil {
        log.Fatalf("writeLines: %s", err)
    }
}