Realmをとりあえずインストールして、自分のアプリ(演劇感想文リンクのアプリ化!)に必要なデータモデルを色々いじっています。
なんとか形になってきたので、データを取り込んでテストを行う状況になりました。
とりあえず、CSVファイルを文字列の形式で、配列の配列に取り込んでその配列からRealmで作成したクラスのインスタンスにデータをセットして保存する手順です。
■CSVファイルを配列の配列に取り込み
ネットで検索すると以下のページがSwift2.0でのCSV取り込みについてのコードとしては新しそうです。
「swift2.0でのCSVの読み込み -stackoverflow」
ページに記載されているコメント等も含めて直すと、以下のコードが動くということらしい。
@IBAction func readcsv(sender: AnyObject) { var result: [[String]] = [] if let csvPath = NSBundle.mainBundle().pathForResource("location", ofType: "csv") { var csvString="" do{ csvString = try NSString(contentsOfFile: csvPath, encoding: NSUTF8StringEncoding) as String textarea.text=textarea.text+csvString } catch let error as NSError { print(error.localizedDescription) } csvString.enumerateLines { (line, stop) -> () in result.append(line.componentsSeparatedByString(",")) } print(result) } }
こういうときに困るのは(僕だけかもしれませんが)どれが、ファイル名とか変数として変えていいのか、swift固有の変数やパラメータで変えちゃいけないのか判然としないことです。
■コードを分析して、とりあえず必要なところだけ理解する。
他サイトのコードなども参考にして、変数の意味を把握して以下のように理解しました。
変数名 | 説明 | 私の実装上の名称 |
---|---|---|
result | 変数。CSVファイルの内容をString型の配列の配列(1行のカンマ区切りの項目を配列化したものが、行単位で配列になって格納される。 | 返り値配列集 |
csvpath | CSVファイルのPATH。今回は、プロジェクト内にCSVファイルを取り込んで実行。 | CSVパス |
“location” | 取り込んだCSVファイルの名称(.csvの前)。 | CSVファイル名(引数) |
csvString | CSVファイルの1行分の文字列(”,”を含む) | CSV文字列 |
textarea | CSVファイルの読み込んだものを表示する画面部品 | (実装せず。結果はprintで確認) |
■CSVファイル読込関数の実装
ということで、以下のようなジェネラル関数を定義し、CSVファイル名を渡せば、文字列型の配列の配列([[String]])が返ってくるようにしました。
func CSV読込(CSV名:String)->[[String]]{ var 返り値配列集:[[String]]=[] if let CSVパス=NSBundle.mainBundle().pathForResource(CSV名, ofType: "csv"){ var CSV文字列="" do{ CSV文字列=try NSString(contentsOfFile:CSVパス,encoding:NSUTF8StringEncoding) as String } catch let エラー as NSError { print(エラー.localizedDescription) } CSV文字列.enumerateLines{(line,stop) -> () in 返り値配列集.append(line.componentsSeparatedByString(",")) } } return 返り値配列集 }
■上記関数を利用して、CSVを読み込むコードの実装
とりあえず、劇評者(演劇感想文リンクの劇評を書いている人の情報)をモデル化した、以下のようなClass定義とそれに対応したCSVデータを作成しました。
class 劇評者型:Object{ dynamic var 劇評者ID:String = "" dynamic var 名前:String = "" dynamic var URL:String = "" dynamic var 更新日 = NSDate() let 劇評集 = LinkingObjects(fromType: 劇評型.self,property:"劇評者") override static func primaryKey() -> String?{ return "劇評者ID" } }
薙野信喜,薙野信喜,http://f-e-now.ciao.jp/,2000/01/01 かわひ,かわひ,http://kawahira.cocolog-nifty.com/fringe/,2000/01/01 SUN CHILD,SUN CHILD,http://sunchild.cocolog-nifty.com/blog/,2000/01/01 Coony,Coony,http://homepage3.nifty.com/engeki/,2000/01/01
劇評者.csvをxcodeのFileメニューのAdd File to <プロジェクト名>のメニューを選択して、プロジェクト内に取り込み以下のコードで、読み込みを行いました。
func 劇評者データ作成(realm:Realm){ //劇評者ID,名前,URL,更新日 //var 劇評者配列集:[[String]]=[] let 劇評者配列集=CSV読込("劇評者") for 劇評者配列 in 劇評者配列集{ for 項目 in 劇評者配列{ print (項目) } } }
次回は、この文字列の項目で読み込んだ配列を、realmに保存します。