はじめに
Golangのファイル読み込みをまとめました。バージョンは1.11.2で確認しました。
os.File Read使用
os.Openでファイルのオープンで取得したos.FileオブジェクトのReadメソッドを使用して読み込みを行います。
Readメソッドの引数に指定した[]byteスライスに内容が読み込まれます。
func useFileRead(fileName string) {
fp, err := os.Open(fileName)
if err != nil {
panic(err)
}
defer fp.Close()
buf := make([]byte, 64)
for {
n, err := fp.Read(buf)
if n == 0 {
break
}
if err != nil {
panic(err)
}
fmt.Println(string(buf))
}
}
ioutil.ReadFile使用
ioutil.ReadFileメソッドを使用してファイルを読み込みます。一度に全データを取得するのでファイルサイズが大きい場合は注意が必要ですが、記述量は少なくて済むのが利点です。
func useIoutilReadFile(fileName string) {
bytes, err := ioutil.ReadFile(fileName)
if err != nil {
panic(err)
}
fmt.Println(string(bytes))
}
bufio.NewReaderSize使用
bufio.NewReaderSizeを使用してファイルを1行ごと読み込みます。1行のサイズが第二引数で指定したサイズを超える場合には、戻り値のisPrefixにfalseが返却されます。
func useBufioNewReaderSize(fileName string) {
fp, err := os.Open(fileName)
if err != nil {
panic(err)
}
defer fp.Close()
reader := bufio.NewReaderSize(fp, 64)
var tmp []byte
for {
line, isPrefix, err := reader.ReadLine() // size を超えるとisPrefixがfalse
if err == io.EOF {
break
}
if err != nil {
panic(err)
}
tmp = append(tmp, line...)
if !isPrefix {
fmt.Println(string(tmp))
tmp = nil
}
}
}
bufio.NewScanner使用
bufio.NewScannerを使用してファイルを1行ごと読み込みます。bufio.NewReaderSizeを使用した場合と比べてシンプルに書けます。
func useBufioScanner(fileName string) {
fp, err := os.Open(fileName)
if err != nil {
panic(err)
}
defer fp.Close()
scanner := bufio.NewScanner(fp)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}
csv.NewReader
csv.NewReaderを使用してcsvファイルを1行ごと読み込みます。csv.NewReaderを呼ぶとcsv.Readerが返却されます。csv.ReaderのCommaに区切り文字を指定すると指定した文字列でデータを分割します。デフォルトは","です。csv.ReaderのReaderメソッドを呼び出すと1行分の分割されたデータがスライスで返却されます。
func userCsvNewReader(fileName string) {
fp, err := os.Open(fileName)
if err != nil {
panic(err)
}
defer fp.Close()
reader := csv.NewReader(fp)
//reader.Comma = ','
reader.LazyQuotes = true
for {
record, err := reader.Read()
if err == io.EOF {
break
} else if err != nil {
panic(err)
}
fmt.Println(record)
}
}