グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



goでデータベースから取得したデータをcsvにして出力する

最近業務で大量のデータをcsvに出力する必要があり、goでのcsv出力方法を調べたのでまとめます。

goでcsv出力のサンプル

goでcsvを出力するために「encoding/csv」が用意されています。

参考:Package csv

「encoding/csv」を使って簡単なcsvを出力する公式ドキュメントサンプルは以下です。

この例では2次元の文字列型のスライスを用意し、 csv.NewWriter にio.Writerを 実装している標準出力「os.Stdout」を渡してcsvのWriterを取得しています。 forでスライスを1行ずつ w.Write で書き込み、最後に w.Flush でバッファに 残っているデータをすべて書き込みます。

実行結果は以下です。

この例では1行ずつ書き込んでいますが上記の例のようにあらかじめ2次元の スライスがある場合には WriteAll でまとめて出力することも可能です。

このようにencoding/csvは簡単に利用できます。

 csv.NewWriter にはio.Writerを実装していればなんでも渡せるので、 以下のようにFileを渡せばcsvをファイルに書きだせます。

encoding/csvで指定できるパラメータ

 csv.NewWriter で返されるWriter構造体は以下のように定義されています。
デフォルトで区切り文字は「,」が設定されており、区切り文字を変えたい場合は以下の用にCommaにruneを設定します。
また、改行文字をCRLF(\r\n)にする場合は以下のようにUseCRLFにtrueを設定します。

データベースから取得したデータをcsvに出力してみる

今回はサンプルとして以下のテーブルを用意しました。

上記にテーブルにfakerなどを使って適当にサンプルデータを入れておきます。 usersテーブルの内容をcsvで出力するgoのサンプルコードは以下になります。

Flushを忘れてはいけないので csv.NewWriter を呼び出した直後にdeferでFlushを指定しておきました。

上記を実行すると「sample.csv」ファイルが作成されます。
作成されたファイルをみてみると・・・

csvが出力されました。

今回はutf8でそのまま出力していますが、データに日本語を含みcsvをエクセルで開きたい場合はShiftJISで出力する必要があります。
その場合はNewWriterに渡す前にtransformで文字コードを指定します。
また改行コードもCRLFを指定します。

利用する為にインストールします

おわりに

encoding/csvを利用して効率よくcsvが出力できるのでとても便利でした。
csv.NewWriterに http.ResponseWriter を渡してそのままダウンロードさせることも可能なので今後もいろいろとio.Writerを組み合わせて利用していきたいと思います。

The following two tabs change content below.

竹内 和也

事業開発部 web application engineer
大学卒業後、Web系ベンチャー企業でシステムエンジニアを経て、2009年にアーティスへ入社。 システムエンジニアとして多くの大学・病院・企業・自社のwebシステム開発に携わる。 2020年より事業開発部として新規サービスの開発に従事している。 資格:LPIC3
この記事のカテゴリ

FOLLOW US

最新の情報をお届けします