LoginSignup
1

More than 5 years have passed since last update.

Go + Revel環境でCSVファイルをOPENして内容を表示する

Posted at

目的:

 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に選択させた結果を後ほどサーバー側へ送付させるためです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1