2015年10月16日

Objective-CでCSVデータを扱う

田中です。

CSVデータの読み込みを行うのにライブラリを探していたところ、以下のライブラリが便利そうでした。

CHCSVParser

使い方

#import "CHCSVParser.h"

@interface ViewController ()
<
  CHCSVParserDelegate
>

@property (nonatomic) NSMutableArray *rows;
@property (nonatomic) NSMutableArray *columns;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *fileName = @"sample";
    NSBundle *bundle = [NSBundle mainBundle];
    NSString *path = [bundle pathForResource:fileName ofType:@"csv"];
    NSURL *url = [NSURL fileURLWithPath:path];
    
    CHCSVParser *parser = [[CHCSVParser alloc] initWithContentsOfDelimitedURL:url delimiter:','];
    parser.delegate = self;

    // 出力にダブルクォートのエスケープ無し
    parser.sanitizesFields = YES;

    // パース開始
    [parser parse];
}

#pragma mark - CHCParserDelegate methods


// パース開始
- (void)parserDidBeginDocument:(CHCSVParser *)parser
{
    self.rows = [NSMutableArray new];
}

// パース完了
- (void)parserDidEndDocument:(CHCSVParser *)parser
{
    // 完了時の処理
}

// パースエラー
- (void)parser:(CHCSVParser *)parser didFailWithError:(NSError *)error
{

}

// 列の読み込み開始
- (void)parser:(CHCSVParser *)parser didBeginLine:(NSUInteger)recordNumber
{
    self.columns = [NSMutableArray new];
}

// フィールドの値読み込み
- (void)parser:(CHCSVParser *)parser didReadField:(NSString *)field atIndex:(NSInteger)fieldIndex
{
    [self.columns addObject:field];
}

// 列の読み込み終了
- (void)parser:(CHCSVParser *)parser didEndLine:(NSUInteger)lineNumber
{
    [self.rows addObject:self.columns];

    self.columns = nil;
}

@end


CSVデータを扱う場合、カンマと改行に気をつけてデータの読み込みを行えばいいですが、値の中にカンマや改行された文やダブルクォートなどがある場合、何も考えずに読み込むとそれらがエスケープされていたりカンマの読み込み位置が間違ったりしてしまいます。
その辺りすべて面倒見てくれるので便利でしたが、値の保持などは自分で作業しないといけないのが少し手間なので自分で管理クラスを作成した方が後々楽そうです。
posted by Seesaa京都スタッフ at 19:13| Comment(0) | iOS | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: