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に保存します。


[…] 先日の「[swift]csvファイルから読込んだデータを配列にセット(Swift2.0)」の続きです。 […]