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; }