目的:
Revel+Goで事前に準備したCSVファイルをOPENして、内容を選択リスト形式で表示する
環境:
Mac 10.10.1
go version 1.3.1
revel
実装内容:
標準パッケージを利用して、CSVファイルをOPENします。得られたDataをそのままRenderの引数として渡します。その後html内でルーチンで処理しています。共通性が高い関数なので個別でcontrollerとして実装しました。
ソースコード
csvreader.go
package controllers
import (
"encoding/csv"
"io"
"log"
"os"
)
type CsvReader struct {
IATACode []string // airport iata code
ICAOCode []string // airport icao code
JPname []string // japanease name
ENname []string // english name
}
func (c *CsvReader) failOnError(err error) {
if err != nil {
log.Fatal("Error", err)
}
}
func (c *CsvReader) OpenCSV(filePath string) {
file, err := os.Open(filePath)
c.failOnError(err)
defer file.Close()
reader := csv.NewReader(file)
for {
record, err := reader.Read()
if err == io.EOF {
break
} else {
c.failOnError(err)
}
// --- Update read csv data
c.IATACode = append(c.IATACode, record[IATA])
c.ICAOCode = append(c.ICAOCode, record[ICAO])
c.JPname = append(c.JPname, record[JPname])
c.ENname = append(c.ENname, record[ENname])
}
}
ERRORハンドラーを実装して、返り値として得られるerrを一括処理させています。
とりあえずErrorをLogに出すだけなので復帰までは実装していません。
次に、展開するCSVファイルのfilepathを引数にするOpenCSVを定義します。defer file.Close()は忘れないように!!
forループの中でCSVファイルを1行づつ読み込みます。配列はrecordです。その後record[xxx]で要素の値を取得し個別の配列にappendしていきます。IATAcode等はPublicなので外からアクセス可能です。
使うときは以下のような方法で使います。
sample.go
// --- make IATA code list for view
csvReader := new(CsvReader)
csvReader.OpenCSV(AirportListCSVFilePath)
iatacodes := csvReader.IATACode
//results := c.db.Find(bson.M{})
//println(results)
return c.Render(iatacodes)
iatacodesをRenderの引数として渡しています。これは次に示すHTMLないで表示させるためです。
sample.html
<label> <strong> Airport IATA Code</strong></label>
<select name="IATAcode">
{{range $index, $code := .iatacodes}}
<option value={{$code}}>{{$code}}</option>
{{end}}
</select>
このようにすることで、iatacodesの中身を表示させています。
selectにname="xxx"をつけている理由は、Userに選択させた結果を後ほどサーバー側へ送付させるためです。