2010-12-22 133 views
2

我正在制作一个需要当前股票价格的iPhone应用程序。iPhone:如何将CSV格式转换为NSData或NSString?

我从下面给出的链接接收CSV格式的数据。

http://finance.yahoo.com/d/quotes.csv?s=RHT+MSFT&f=sb2b3jk

是否有可能到CSV格式转换为NSData的或NSString的格式?

如果是,我该如何将CSV格式转换为NSData格式或NSString格式?

可以做些什么?

什么可以是其他的替代品呢?

请帮忙推荐

感谢

+0

你问如何解析CSV数据? – 2010-12-22 09:14:49

回答

7

不要重新发明轮子: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" 
    ), 
     (
     "" 
    ) 
) 

它返回的NSStringsNSArraysNSArray

3

假设你是问如何解析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.如果引用部分包含逗号,则解析器将错误地分割该行。

+0

感谢您的意见。我不清楚你在NOTE中写了些什么。你的注意是什么意思?在什么意义上它不涉及报价?感谢:] – 2010-12-22 09:33:16

+0

注意已更新。也就是说,你在帖子中显示的数据看起来很好,第一列,我猜是引号符号,但如果你不需要它们,你可以自行剥离引号。 – 2010-12-22 09:46:12