おとうさまくんの手作り工房

日曜大工としてのプログラミングを紹介します。

【iOS備忘録】 CSVファイル→plistファイル→読み込み

初期設定などのデータをCSVファイルで作っておいて、それを読み込ませる方法です。

 

1.CSVファイルをplistファイルに変換する

とても便利なツールが有ります。CSV2Plist というツールです。

CSV2Plist - Sheepapp からダウンロードしてデスクトップなどに置いておきましょう。

CSVファイルをドロップすれば自動的にplistファイルが生成されます。

 

図がCSVの編集画面です。ちなみにEXCELで編集してます。

f:id:otousamakun:20141117010909p:plain

 

ツールを使って生成したplistファイルです。

f:id:otousamakun:20141117010923p:plain

 

(補足)

 CSV2Plist (Version 1.0.2)では、データに , (カンマ)が含まれていると変換できません。変換しようとしても何も反応しません。

 csvファイルのカンマの数が合わないのが原因でしょうね。

 特にEXCELで編集していると気が付きにくいので気をつけましょう。

 

 

2.plistファイルをプロジェクトに追加

 fileメニューの [ Add Fils To …] でplistファイルを追加するか、ファイルをドロップして追加する。

 

3.初期設定として読み込む 

    NSString* path = [[NSBundle mainBundle] pathForResource:@"data"ofType:@"plist"];

    NSArray *array = [NSArray arrayWithContentsOfFile:path];

 

 

 

4.読み込んだ配列を使う

    for (int i=0; i<[array count]; i++) {

        NSLog(@"Item%dの「項目1」は「%@",i,[array[i] objectForKey:@"項目1"]);

    }

 

  実行結果

   Item0の「項目1」は「あいう」

   Item1の「項目1」は「かきく」

   Item2の「項目1」は「さしす」

   Item3の「項目1」は「たちつ」

   Item4の「項目1」は「なにぬ」

 

5.ちなみに

 CSVファイルではItem0の項目4にデータがありませんでしたが、plistになったらデータはどうなったのでしょうか。実行結果で見ると(null)ではありませんでした。存在しないkeyでは(null)が返されますが、CSV2Plistでは全てのItemで値を設定しているのが分かります。(null)ではなく、長さ0の文字列(@"")が入っているのですね。

    Item0の「項目4」は「」

    Item1の「項目4」は「」

    Item2の「項目4」は「BCD

    Item3の「項目4」は「234

    Item4の「項目4」は「」

 

 

  (比較)

    Item0の「存在しない項目」は「(null)

 

 

 

6.ちなみにちなみに

 全てのItemの全ての項目を取得したいならfor in が便利ですね。ただし、取り出すkeyの順番通りではありません。

    for (int i=0; i<[array count]; i++) {

        for (NSString *key in [array[i] allKeys]) {

            NSLog(@"Item%dの「%@」は「%@",i,key,[array[i] objectForKey:key]);

        }

    }

 

  実行結果

    Item0の「項目4」は「」

    Item0の「項目1」は「あいう」

    Item0の「項目2」は「えお」

    Item0の「項目3」は「ABC

    Item1の「項目4」は「」

    Item1の「項目1」は「かきく」

    Item1の「項目2」は「けこ」

    Item1の「項目3」は「123

    Item2の「項目4」は「BCD

    Item2の「項目1」は「さしす」

    Item2の「項目2」は「せそ」

    Item2の「項目3」は「A

    Item3の「項目4」は「234

    Item3の「項目1」は「たちつ」

    Item3の「項目2」は「てと」

    Item3の「項目3」は「1

    Item4の「項目4」は「」

    Item4の「項目1」は「なにぬ」

    Item4の「項目2」は「ねの」

    Item4の「項目3」は「abc

 

7.ちなみに×3

 for ;; や for in より処理速度を追求するなら enumarateObjectsUsingBlockを使う方が良いらしいです。これは、NSArray のインスタンスメソッドで、配列の中の要素を一通り呼び出してブロック文を実行します。停止フラグの *stop にYESを代入するとblock文から抜け出します。

    [array enumerateObjectsUsingBlock:^(NSDictionary *dic, NSUInteger i, BOOL *stop) {

        [[dic allKeys] enumerateObjectsUsingBlock:^(NSString *str, NSUInteger i, BOOL *stop) {

            NSLog(@"Item%liの「%@」は「%@",i,str,[dic objectForKey:str]);

        }];

    }];

 

  実行結果(6.と一緒)

    Item0の「項目4」は「」

    Item0の「項目1」は「あいう」

    Item0の「項目2」は「えお」

    Item0の「項目3」は「ABC

    Item1の「項目4」は「」

    Item1の「項目1」は「かきく」

    Item1の「項目2」は「けこ」

    Item1の「項目3」は「123

    Item2の「項目4」は「BCD

    Item2の「項目1」は「さしす」

    Item2の「項目2」は「せそ」

    Item2の「項目3」は「A

    Item3の「項目4」は「234

    Item3の「項目1」は「たちつ」

    Item3の「項目2」は「てと」

    Item3の「項目3」は「1

    Item4の「項目4」は「」

    Item4の「項目1」は「なにぬ」

    Item4の「項目2」は「ねの」

    Item4の「項目3」は「abc