PLISTからCSVに変換する方法

CSVからPLISTに変換するには、つつみさんの記事の方法や、CSV2PlistというMacアプリで解決できる。

ただ、PLISTからCSVに変換する方法が探しても見つからなかったので、GitHub - davedelong/CHCSVParser: A proper CSV parser for Objective-C
を使ってObj-cで書いてみた。

リソースに変換したいPLISTぶっこんで、サンドボックスのDocumentsにCSVを生成する。

前提としては、CSV2Plistで生成した、PLISTをCSVに戻すような感じで。
(※もちろん階層が複雑なPLISTはCSVに変換できるわけがない)

#import "CHCSVParser.h"

- (void)convertToCsvFromPlist:(NSString *)fileName{

    NSString *plistPath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"plist"];

    NSArray *plistArray = nil;
    if ([[NSFileManager defaultManager]fileExistsAtPath:plistPath]) {
        plistArray = [NSArray arrayWithContentsOfFile:plistPath];
    }
    
    if (plistArray == nil) {
        return;
    }
    
    NSString *outputFileName = [NSString stringWithFormat:@"%@.csv",fileName];
    NSString *outputFilePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents" ] stringByAppendingPathComponent:outputFileName];
    
    NSOutputStream *stream = [NSOutputStream outputStreamToFileAtPath:outputFilePath append:NO];
    CHCSVWriter *csvWriter = [[CHCSVWriter alloc] initWithOutputStream:stream encoding:NSShiftJISStringEncoding delimiter:','];
    
    for (NSInteger i = 0; i < [plistArray count]; i++) {
        NSDictionary *dic = (NSDictionary*)[plistArray objectAtIndex:i];
        if (i==0) {
            for (id key in [dic keyEnumerator]) {
                [csvWriter writeField:key];
            }
            [csvWriter finishLine];
        }
        
        for (id key in [dic keyEnumerator]) {
            [csvWriter writeField:[dic valueForKey:key]];
        }
        [csvWriter finishLine];
    }
}

encodingをNSUTF8StringEncodingにすると、生成されたCSVをひらいたときに文字化けしたので、NSShiftJISStringEncodingにしている。

カラムの順序がPLISTのときとかわってしまうので、順序をかえたくない場合は、下記のようにする必要がありそうな。ちょっと強引だけれども。他にいい方法ありそう。
(ただし、カラム名がわかっている場合のみ)

- (void)convertToCsvFromPlist:(NSString *)fileName{

    //----略----
    for (NSInteger i = 0; i < [plistArray count]; i++) {
        NSDictionary *dic = (NSDictionary*)[plistArray objectAtIndex:i];
        NSArray *array = [self sortDic:dic];
        
        if (i==0) {
            for (NSString *str in array) {
                NSString *key = [[str componentsSeparatedByString:@"<>"] objectAtIndex:1];
                [csvWriter writeField:key];
            }
            [csvWriter finishLine];
        }
        
        for (NSString *str in array) {
            NSString *value = [[str componentsSeparatedByString:@"<>"] objectAtIndex:0];
            [csvWriter writeField:value];
        }
        
        [csvWriter finishLine];
    }
}


- (NSArray *)sortDic:(NSDictionary *)dic
{   
    NSMutableArray *array = [[NSMutableArray alloc]init];
    [array addObject:[NSString stringWithFormat:@"%@<>%@",[dic objectForKey:@"columnA"],@"columnA"]];
    [array addObject:[NSString stringWithFormat:@"%@<>%@",[dic objectForKey:@"columnB"],@"columnB"]];
    [array addObject:[NSString stringWithFormat:@"%@<>%@",[dic objectForKey:@"columnC"],@"columnC"]];
    [array addObject:[NSString stringWithFormat:@"%@<>%@",[dic objectForKey:@"columnD"],@"columnD"]];
    return array;
}