【iOS備忘録】 CSVファイル→plistファイル→読み込み
初期設定などのデータをCSVファイルで作っておいて、それを読み込ませる方法です。
1.CSVファイルをplistファイルに変換する
とても便利なツールが有ります。CSV2Plist というツールです。
CSV2Plist - Sheepapp からダウンロードしてデスクトップなどに置いておきましょう。
CSVファイルをドロップすれば自動的にplistファイルが生成されます。
図がCSVの編集画面です。ちなみにEXCELで編集してます。
ツールを使って生成したplistファイルです。
(補足)
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」