【问题标题】:How to convert CSV format into NSData or NSString in iPhone?如何在 iPhone 中将 CSV 格式转换为 NSData 或 NSString?
【发布时间】:2018-05-25 02:24:07
【问题描述】:

我正在制作一个需要当前股票价格的 iPhone 应用程序。

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

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

是否可以将 CSV 格式转换为 NSData 或 NSString 格式?如果是,我该怎么做?

还有什么其他的选择?

【问题讨论】:

  • 你是在问如何解析 CSV 数据?

标签: iphone objective-c csv


【解决方案1】:

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

它返回NSArrayNSArraysNSStrings

【讨论】:

  • CHCSVParser 是 mac 项目,我如何在 iphone 中使用它?
【解决方案2】:

假设您询问如何解析 CSV 数据,这里有一段非常简单的代码来完成。如果您想找到更高级的解析器,请使用 google - 他们就在那里..

// 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. 如果引用部分包含逗号,则解析器将错误地拆分行。

【讨论】:

  • 感谢您的意见。我不太清楚你在注释中写了什么。你的注释是什么意思?在什么意义上它不处理引号?谢谢:]
  • 注释已更新。也就是说,您在帖子中指出的数据看起来不错,第一列,我猜是引用了股票代码,但如果您不想要引号,您可以自己去掉引号。
  • J Buchanan:感谢您的帮助:]
  • myCsvResponseAsAString 将属于哪种类型?我的意思是哪种数据类型?
  • 是NSString的数组(列)的数组(行)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多