サイトアイコン 演劇とかの感想文ブログ

[swift]csvファイルから読込んだデータを配列にセット(Swift2.0)

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]日本語でプログラミングしてみる。

モバイルバージョンを終了