Symfoware

Symfowareについての考察blog

elixir CSVファイルを1行づつ読み込み、内容をMariaDBに登録する

elixirからMariaDBに接続、データの登録と検索を行いました。
elixirからMariaDBに接続する(Mariaex)

もう少し実用的なサンプルとして、テキストファイルを読み込み、
内容をデータベースに登録してみます。


登録用のデータと加工



登録データは郵便番号csvを使用することにしました。
郵便番号データダウンロード

件数の少ない沖縄県を選択。
nkfでutf-8に変換しておきます。


# nkf -w 47OKINAW.CSV > zip_utf8.csv



FreeBSD 10.1 nkfをpkg installでインストールし、ファイルの文字コードを変換する




テーブルレイアウト



登録するテーブルのレイアウトはこんな感じ。


CREATE TABLE post (
zip_code char(7) not null,
address varchar(200)
)






elixirでテキストファイルの読み込み



テキストファイルの読み込みはこちらを参考にします。
IO and the file system

まず、ファイルを1行づつ読み込んで処理するところまで。


  1. # csvファイルをutf-8でオープン
  2. {:ok, fp} = File.open("zip_utf8.csv", [:read, :utf8])
  3. # 一行づつ読み込み
  4. Enum.each(IO.stream(fp, :line), fn(line) ->
  5.     
  6.     # カンマで分割し、リストからタプルに変換
  7.     row = List.to_tuple( String.split(line, ",") )
  8.     
  9.     # 前後の「"」を除去し、郵便番号(7桁)取得
  10.     zip = String.strip(elem(row, 2), ?")
  11.     
  12.     # 住所は3つに分割されているので、結合
  13.     address = String.strip(elem(row, 6), ?")
  14.                 <> String.strip(elem(row, 7), ?")
  15.                 <> String.strip(elem(row, 8), ?")
  16.     
  17.     IO.puts zip
  18.     IO.puts address
  19.     
  20. end)
  21. # ファイルクローズ
  22. File.close(fp)




実行結果


# elixir sample.exs
9000000
沖縄県那覇市以下に掲載がない場合
9010154
沖縄県那覇市赤嶺
9000002
沖縄県那覇市曙






データベースに登録する処理を追加。


  1. # データベースに接続
  2. {:ok, p} = Mariaex.Connection.start_link(username: "admin", database: "sample")
  3. # csvファイルをutf-8でオープン
  4. {:ok, fp} = File.open("zip_utf8.csv", [:read, :utf8])
  5. # 一行づつ読み込み
  6. Enum.each(IO.stream(fp, :line), fn(line) ->
  7.     
  8.     # カンマで分割し、リストからタプルに変換
  9.     row = List.to_tuple( String.split(line, ",") )
  10.     
  11.     # 前後の「"」を除去し、郵便番号(7桁)取得
  12.     zip = String.strip(elem(row, 2), ?")
  13.     
  14.     # 住所は3つに分割されているので、結合
  15.     address = String.strip(elem(row, 6), ?")
  16.                 <> String.strip(elem(row, 7), ?")
  17.                 <> String.strip(elem(row, 8), ?")
  18.     
  19.     # プレースフォルダを使用してのデータ登録
  20.     Mariaex.Connection.query(p, "INSERT INTO post VALUES(?, ?)", [zip, address])
  21.     
  22. end)
  23. # ファイルクローズ
  24. File.close(fp)







引数を受け取り検索



検索するプログラムはこんな感じになりました。


  1. # コマンドライン引数を取得
  2. [zip] = System.argv()
  3. # データベースに接続
  4. {:ok, p} = Mariaex.Connection.start_link(username: "admin", database: "sample")
  5. # データの検索
  6. {:ok, result} = Mariaex.Connection.query(p, "SELECT address FROM post where zip_code = ?", [zip])
  7. # 内容を表示
  8. Enum.each(result.rows, fn(row) ->
  9.     [address] = row
  10.     
  11.     IO.puts address
  12. end)




実行結果


# elixir sample.exs 9010154
沖縄県那覇市赤嶺




狙い通りの動作です。
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/07/26(日) 22:29:30|
  2. Erlang
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<elixir + exjsxでjsonのエンコード、デコード | ホーム | FreeBSD 10.1 nkfをpkg installでインストールし、ファイルの文字コードを変換する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1767-80602b98
この記事にトラックバックする(FC2ブログユーザー)