Where can I find a CSV to NSArray parser for Objec

2019-01-05 00:10发布

I'm looking for an easy to use CSV parser for Objective-C to use on the iPhone. Where can I find one?

I'm also looking for other parsers such as JSON, so maybe there is a conversion library somewhere.

8条回答
Melony?
2楼-- · 2019-01-05 00:48

I finally got around to cleaning up a parser I've had in my code folder and posted it on Github: http://github.com/davedelong/CHCSVParser

It's quite thorough. It handles all sorts of escaping schemes, newlines in fields, comments, etc. It also uses intelligent file loading, which means you can safely parse huge files in constrained memory conditions.

查看更多
Deceive 欺骗
3楼-- · 2019-01-05 00:53

This seems to be the most comprehensive that I've found so far.

http://www.macresearch.org/cocoa-scientists-part-xxvi-parsing-csv-data

As a side note, you'd think most major languages (Delphi, C#, Objective-c, php etc) would have a library available with a full implementation of this basic data interchange format.

I know json is cool and XML is reliable but neither are available as a save option from most applications saving table data. CSV still is.

查看更多
ゆ 、 Hurt°
4楼-- · 2019-01-05 00:54

Here's a simple category on NSString to parse a CSV string that has commas embedded inside quote blocks.

#import "NSString+CSV.h"

@implementation NSString (CSV)

- (NSArray *)componentsSeparatedByComma
{
    BOOL insideQuote = NO;
    NSMutableArray *results = [[NSMutableArray alloc] init];
    NSMutableArray *tmp = [[NSMutableArray alloc] init];

    for (NSString *s in [self componentsSeparatedByString:@","]) {
        if ([s rangeOfString:@"\""].location == NSNotFound) {
            if (insideQuote) {
                [tmp addObject:s];
            } else {
                [results addObject:s];
            }
        } else {
            if (insideQuote) {
                insideQuote = NO;
                [tmp addObject:s];
                [results addObject:[tmp componentsJoinedByString:@","]];
                tmp = nil;
                tmp = [[NSMutableArray alloc] init];
            } else {
                insideQuote = YES;
                [tmp addObject:s];
            }
        }
    }

    return results;
}

@end

This assumes you've read your CSV file into an array already:

myArray = [myData componentsSeparatedByString:@"\n"];

The code doesn't account for escaped quotes, but it could easily be extended to.

查看更多
一纸荒年 Trace。
5楼-- · 2019-01-05 00:56

As xmr said above: It's possible in Objective C to convert an NSString csv into 'components separated by string' array.

    NSArray* items;
    items=[bufferString componentsSeparatedByString:@","];       

In case you are interested in csv export having arrived at this thread - as I did - here is an extract of how I exported a csv file.

    NSString* fileName    = @"Level";
    fileName = [fileName stringByAppendingString:levelNumberBeingEdited];
    fileName = [fileName stringByAppendingString:@".txt"];
    NSString* bufferString=@"";  

Buffer String is populated by looping through each data item (not shown) and inserting a comma between each. Finally it's exported.

    NSString* homeDir = NSHomeDirectory();
    NSString* fullPath = [homeDir stringByAppendingPathComponent:fileName];
    NSError* error = nil;
    [bufferString writeToFile:fullPath atomically:NO encoding:NSASCIIStringEncoding error:&error];
查看更多
贼婆χ
6楼-- · 2019-01-05 00:58

Well, above simple solutions doesn't take into account multiple records. Use the following code reading a default excel CSV using ASCI 13 as line end marker:

NSString *content =  [NSString stringWithContentsOfFile:filepath encoding:NSUTF8StringEncoding error:nil];
NSArray *contentArray = [content componentsSeparatedByString:@"\r"]; // CSV ends with ACSI 13 CR (if stored on a Mac Excel 2008)

for (NSString *item in contentArray) {
    NSArray *itemArray = [item componentsSeparatedByString:@";"];
    // log first item
    NSLog(@"%@",[itemArray objectAtIndex:0]);
}
查看更多
相关推荐>>
7楼-- · 2019-01-05 01:00

Quick way to do this:

NSString *dataStr = [NSString stringWithContentsOfFile:@"example.csv" encoding:NSUTF8StringEncoding error:nil];
NSArray *array = [dataStr componentsSeparatedByString: @","];

查看更多
登录 后发表回答