ぴすぺーす

あたしのスペース、あたしのペースで。

GolangでCSVを操作してみる①

CSVファイルについて

golangを学習中なのですが、CSVファイルを読み込んだり書き込んだりすることが、学習に役立つとのことだったので、早速やってみよう!と思ったのですが、そもそもCSVってなんぞや状態でした。
調べてみたところ、以下のような記述がありました


CSV」とは "Comma Separated Value" の略で、データをカンマ(" , ")区切った値の事です。アプリケーション間でデータをやり取りする際に使われます。CSV形式で保存されたファイルを「CSVファイル」と呼びます。
出典 CSVファイルとは? | サービス | プロエンジニア

ふむふむ。わかったようなわからないような。
更に調べてみました


  • メモでもエクセルでも開けるので互換性がある

(エクセルファイルだとエクセルがないと開けませんよね?)

  • 容量が軽い

(でもエクセルみたいにセルの書式設定なんかはできないみたいです)




他にもなぜCSVファイルを使うのか、っていう特徴があれば教えていただきたいです。そもそも私の理解はあっているのだろうか(笑)



CSVを操作してみよう

CSVなんぞやを理解したところで、golangで操作するにはどうしたらいいのかなって話に移りたいと思います。まず操作の内容としては、「読み込み」「書き込み」「新規作成」を今回はとりあげます。その操作のなかでもざっくりとしたやつを、ね。以下、コードです。




package main

import (
	"encoding/csv"
	"log"
	"os"
)

func main() {
	// 読み書き+追記+新規作成(ファイルがない場合)
	file, err := os.OpenFile("/パス名/test.csv", os.O_RDWR|os.O_APPEND|os.O_CREATE, 0700)
	if err != nil {
		log.Fatal("ErrorMessage:", err) // エラーメッセージを表示してプログラムを終了
	}
	// クローズは必須
	defer file.Close()

	writer := csv.NewWriter(file)

	writer.Write([]string{"A", "1"}) //一行ずつバッファ(一時的に保存する場所)にためていく
	writer.Write([]string{"B", "2"})
	writer.Write([]string{"C", "3"})
	writer.Write([]string{"D", "4"})
	writer.Write([]string{"E", "5"})
	writer.Write([]string{"F", "6"})

	writer.Flush() //バッファにためたものを一気に書き込み
}





os.OpenFileを使用することで、色々設定して開くことができるみたいで、とっても便利ですね!それぞれの引数に何を渡せば良いのかは以下になります。




第一引数 : ファイルのパス (ファイルの在処と名前みたいなものです。)
第二引数 : フラグ (何をしたいかみたいなことです)
第三引数 : パーミッション (0700はファイル所有者である私だけが、読み書き実行できる設定です)



次にエラー処理です。ファイルをオープンできなかった(存在しない等)場合にos.OpenFileはエラーを返してくるので、その際の処理を書きます。ちなみにですが、今回はos.O_CREATEを引数にとっているので、存在しない場合もエラーにはならずに、新規作成されることになります。




その次は、忘れてはいけないクローズですね。deferにしているので、if文でエラーが発生した場合の処理がなされても、最後にきちんとクローズされます。ちなみに、クローズしないとプログラムの不具合の元になってしまうみたいです。(詳しくどういう不具合が起きるのかわかる方がいればぜひ教えてください。)





書き込みの部分はコメントで記載しているとおりです。



これでとりあえず、CSVを新規作成したり書き込みしたり読み込みしたりできます。ちなみにこれを実行する時のコマンドをちょっと変えると、入力されているものをターミナルで確認することができちゃいます。


$ go run testcsv.go
$ go run testcsv.go && cat /パス名/test.csv

1行目で実行すると、ただ実行されるだけ。つまり、CSVが作成されるなり書き込みされるなりするだけなのですが、2行目で実行すると、ターミナルに内容が表示されて、どういうデータがあるのか確認することができます。



とりあえず、まずは実行してみてください!!私は今回CSVの操作を学ぶにあたり、人のコードをコピーして実行して、体験してから詳細を調べるようにしました。まずは動きを確かめることが、理解につながるのではないかなと思います。


ちなみにパスなんかわからないし、気にしないしとりあえずやってみたいって方は、コードの"/パス名/test.csv"の部分を"test.csv"にしていただければ現在のディレクトリに作成されるので、コピペして実行してみてください。(実行のときにcatを使う場合は、/パス名/test.csvをtest.csvにしてください。)



まだまだ勉強はじめたてで、曖昧な部分も多いですが、今回学んだことをまとめてみました。間違いやご指摘、アドバイスあればぜひお願いします。


参考:
Go言語のエラーハンドリングについて
Goでファイル追記・存在しなかったらファイル作成したい!
CSVのパース/生成 - はじめてのGo言語
Go言語でCSVを書き出す!エクセル用のSJIS版も!
パーミッション早見表