如何在iPhone中将CSV格式转换为NSData或NSString?

我正在制作一款需要当前股票价格的iPhone应用程序。 我从下面给出的链接接收CSV格式的数据。 http://finance.yahoo.com/d/quotes.csv?s=RHT+MSFT&f=sb2b3jk 是否可以将CSV格式转换为NSData或NSString格式?如果是,我该怎么办? 对此有什么其他选择?     
已邀请:
不要重新发明轮子:CHCSVParser是用Objective-C编写的本机CSV解析器。它可以正确处理引用字段,转义字符等。它具有方便的方法(
+[NSArray arrayWithContentsOfCSVFile:...]
)并且可以对文件读取进行分块,以免产生低内存警告。 这里(或多或少)你如何使用它。 CSV文件是远程的,使事情变得复杂,但不多(你必须将URL的内容下载到字符串中,然后将该字符串传递给解析器)。
#import "CHCSV.h"

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSString * csv = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://download.finance.yahoo.com/d/quotes.csv?s=RHT+MSFT&f=sb2b3jk"]];
    NSArray * rows = [NSArray arrayWithContentsOfCSVString:csv encoding:NSUTF8StringEncoding error:nil];
    //You can also do:  rows = [csv CSVComponents];
    NSLog(@"rows: %@", rows);
    [pool drain];
    return 0;
}
这个日志:
2010-12-23 09:05:44.431 CHCSVParser[99377:a0f] (
        (
        RHT,
        "46.48",
        "46.46",
        "26.51",
        "49.00"
    ),
        (
        MSFT,
        "28.23",
        "28.22",
        "22.73",
        "31.58"
    ),
        (
        ""
    )
)
它返回
NSStrings
NSArrays
。     
假设您正在询问如何解析CSV数据,这里有一个非常简单的代码。如果你想找到更高级的解析器,请使用谷歌 - 它们就在那里。
// CsvParser2.h
#import <Foundation/Foundation.h>

@interface NSString (CsvParser2)
// Returns an array of arrays for rows & columns
-(NSArray *)csvRows;
@end


// CsvParser2.m
#import "CsvParser2.h"

@implementation NSString (CsvParser2)

// Simplest possible implementation... NOT memory efficient!
// No apologies, no refunds...
-(NSArray *)csvRows
{   
    NSMutableArray* outRows = [NSMutableArray array];

    NSCharacterSet* newlineCharSet = [NSCharacterSet newlineCharacterSet];
    NSCharacterSet* separatorCharactersSet = [NSCharacterSet characterSetWithCharactersInString:@","];

    NSArray* lines = [self componentsSeparatedByCharactersInSet:newlineCharSet];
    for ( NSString* line in lines )
    {
        if ( !line.length ) continue;
        NSArray* columns = [line componentsSeparatedByCharactersInSet:separatorCharactersSet];
        if ( columns.count )
        {
            [outRows addObject:columns];
        }
    }

    return outRows; // autoreleased
}

@end
这被定义为NSString上的一个类别,只是使用它
NSMutableArray* myResponseAsArrayOfArraysOfStrings = [myCsvResponseAsAString csvRows];
for ( NSArray* row in myResponseAsArrayOfArraysOfStrings )
{
   for ( NSString* column in row )
   {
       NSLog( "%@", column );
   }
}
希望这可以帮助! 注意,此解析器不处理引号。亦即 1.如果引用字段,则不会删除引号。 2.如果引用的部分包含逗号,则解析器将错误地拆分该行。     

要回复问题请先登录注册