mkinoさんのHMDT BBSで出てきた辞書配列をCSV形式ファイルに出力する方式の問題で、私が提案していたBSDレベルのAPIを使ってCSV形式ファイルに出力するクラスを作ってみました。
NSArrayを指定された区切り文字でつないだ文字列に変換するメソッドは「はらを」さんに教えていただいた方法を使用しました。情報ありがとうございました。m(__)m
なお、このインプリメントでは辞書のキーの出力順序を制御できないので、実用に供する場合はパラメータとしてキーの一覧(NSArray)をもらうようにすればよいでしょう。
#import <Foundation/Foundation.h>
// 区切り記号
#define DELIMITER @","
@interface UCDicArrayToCSV : NSObject
{
}
// DictionaryのArrayをCSVファイルに出力する
+ (BOOL)writeDictionaryArray:(NSArray *)poDicArr byCSVFormatToPath:(NSString *)pstrPath;
@end
#import "UCDicArrayToCSV.h"
#import <stdio.h>
@implementation UCDicArrayToCSV
// DictionaryのArrayをCSVファイルに出力する
+ (BOOL)writeDictionaryArray:(NSArray *)poDicArr byCSVFormatToPath:(NSString *)pstrPath
{
// ヘッダ書き込みの制御のためすでにファイルが存在するかチェックしておく
BOOL bAlreadyExist = [[NSFileManager defaultManager] fileExistsAtPath:pstrPath];
// 出力ファイルオープン
FILE *fp = fopen( [pstrPath cString], "a" );
if ( fp == NULL ) {
NSLog( @"Open error.(path=%@)\n", pstrPath );
return NO;
}
// 配列が空でないかチェック
if ( [poDicArr count] == 0 ) {
fclose( fp );
return YES;
}
// 配列に格納されているNSDictionaryのキー一覧取得
NSArray *parrKeys = [[poDicArr objectAtIndex:0] allKeys];
// 初回書き込み時はキー一覧をCSV形式文字列に変換しヘッダとして出力
if ( bAlreadyExist == NO ) {
NSString *pstrHdr = [parrKeys componentsJoinedByString:DELIMITER];
fprintf( fp, "%s\n", [pstrHdr cString] );
}
// Arrayの各エントリの値をファイルに書き出す
int nCnt = [poDicArr count];
int i;
for ( i = 0; i < nCnt; i++ ) {
// 各ディクショナリの値一覧を取得する
NSArray *parrVals = [[poDicArr objectAtIndex:i] objectsForKeys:parrKeys notFoundMarker:@""];
// 値一覧をCSV形式文字列に変換しデータとして出力
NSString *pstrVals = [parrVals componentsJoinedByString:DELIMITER];
fprintf( fp, "%s\n", [pstrVals cString] );
}
// ファイルクローズ
fclose( fp );
return YES;
}
@end