CSVをObjective-cでPlistに変換する


いま製作中のアプリにPlistからデータを生成する部分があります。CSVからPlistを作るのにツールを使っているのですが若干クセがあって使いづらく感じていました。データの更新ごとにこの作業は面倒、さらにデータの更新にあわせてアプリのリリースするのもよろしくないのでネット経由でいけるようにしてみた。

つまりサーバに置いてあるCSVを持ってきてPlist化して保存みたいな。そのままNSArrayでいいじゃんとも今気づきましたwそのうち改善しよう。

ダウンロード部分や保存は除いてコアになる部分は以下の二つのメソッド。切り分けたほうが再利用しやすいと思ったので別メソッドにしてます。

まずはファイルを1行毎に区切って配列にして返してくれるメソッド。

こちらで紹介されていた1行ずつ取り出すメソッドを参考にしました。
NSString

改行までを取り出したら改行コードを外して配列化していきます。

//受け取り文字列を一行づつに分割して配列を返す
- (NSArray*)makeParsedArray:(NSString*)string
{
    NSMutableArray  *parseArray = [NSMutableArray array];
    NSString* parsedString;
    NSRange range, subrange;
    int length;

    length = [string length];
    range = NSMakeRange(0, length);
    while(range.length > 0) {
        subrange = [string lineRangeForRange:NSMakeRange(range.location, 0)];
        parsedString = [string substringWithRange:subrange];
        parsedString = [parsedString stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];

        [parseArray addObject:parsedString];

        range.location = NSMaxRange(subrange);
        range.length -= subrange.length;
    }

    return parseArray;
}

1行毎の配列からキーになる文字列とデータを取得しながら辞書を作って配列化していきます。
このコードではdefineしてるKEYSTRINGLINEがキーになる列でBEGINDATALINEがデータの開始行になります。使うCSVに合わせて調節が必要です


//カンマ区切りの文字列を辞書化して配列を戻す
-(NSArray*)makePlistArray:(NSArray*)array{
#define KEYSTRINGLINE 1
#define BEGINDATALINE 2
    NSArray *dataArray;
    NSMutableArray *plistArray=[NSMutableArray array];
//キー文字列の配列化
    NSArray *keyArray=[[array objectAtIndex:KEYSTRINGLINE] componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]];

    for (int i=BEGINDATALINE;i<[array count];i++){
//データ部分の配列化
        dataArray=[[array objectAtIndex:i] componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]];
        NSDictionary *dict = [[NSDictionary alloc] initWithObjects:dataArray forKeys:keyArray];
        [plistArray addObject:dict];
        [dict release];
    }
    return plistArray;
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です