Excellで作ったデータをCSVにしてSQLiteに入れるのをmacでやる


Screen Shot 2014 10 20 at 21 59 04

これは先日作った寿司アプリの件が発端なのですが、手順がめんどうなので忘れないよう個人的メモです。
macで作業をするのであれば最初からNumberを使えば良かったのかも・・笑

概要

アプリに使う解説文章や、様々なプロパティなどは人間が本で勉強して手でupdateしていくので管理しやすそうなExcellを使う事にしました。
ところが、Office for macのExcellの中身を全て最終的にSQLiteに突っ込んでアプリケーション内で参照できるようにしなければなりません。
当初、アプリで簡単にImportできるような機構がこの世に存在すると思っていたのですが、全然見当たらずCSVに一度吐き出す という周りくどいやり方しか見いだせませんでした。

しかも、下記の通り文字コード変換までしなくてはならないご様子で本当に骨が折れる。

実際にやった方法

①Excelで1シートだけ別の新規Excelファイルにコピペする。
なぜか複数シートあるとCSV保存がうまくいかなかった。Excellその辺なんとかならんのぉ?♂

②CSV保存でCSV形式に変更して保存し、そのファイルをテキストエディタでUTF8に変換する
macなのにー!! office for mac 製品は内部でShift-JISを扱っているようでして、CSV保存したとしても文字コードがShift-JISでした笑
なので、適当にテキストエディタ(自分の場合はcotEditor)でShift-JIS → UTF-8、 CRLF → LFに変換して上書き保存しました。

③スクリプトでSQLiteにインサート
macのSQLiteクライアントはLitaを使っているのですが、CSVインポートできないんですね・・なんかあるもんだと思って作業を進めていました・・
(;・∀・)

というわけで適当にrubyでまるごとINSERTするスクリプトを書きました。
これを各table分一度作ってしまえば毎回使いまわせるぜ って思ってCSVインポートできるSQLiteクライアント探しを諦めました。

# coding: utf-8

require 'csv'
require 'pp'
require 'sqlite3'

def insCSV
  db = SQLite3::Database.new("filename.sqlite")
  sql = "DELETE FROM table1"
  db.execute(sql)
  CSV.foreach("./data.csv") do |row|
    sql = "insert into table1
          (col1, col2, col3, col4, col5, col6, col7, col8, col9)
          values
          (?, ?, ?, ?, ?, ?, ?, ?, ?)"
    db.execute(sql, row[0].to_i, row[1], row[2], row[3], row[4], row[5], row[6].to_i, row[7], row[8])
    puts row[1]
  end
  db.close
end

insCSV

まとめ

はい、というわけでmacで作業する場合は最初からExcellを使うのをやめればよくね っていう事に気が付きました。
それか、このエントリを書いていて気が付きましたがruby内でS-JISをUTF-8に変換してしまっても手間がひとつ減るかも。

いずれにせよ、もっと( ・∀・)イイ!!! やり方ある! っていう方いらっしゃいましたら、是非教えて下さい。。

 



関連記事

Comment





Comment



*