【问题标题】:Import csv data (SDK iphone)导入csv数据(SDK iphone)
【发布时间】:2010-03-15 03:47:18
【问题描述】:

对于下面的代码,我可以读取字符串中的所有数据,并成功获取绘图数据。

NSMutableArray *contentArray = [NSMutableArray array];
NSString *filePath = @"995,995,995,995,995,995,995,995,1000,997,995,994,992,993,992,989,988,987,990,993,989";
NSArray *myText = [filePath componentsSeparatedByString:@","];  
NSInteger idx;    
for (idx = 0; idx < myText.count; idx++) {
    NSString *data =[myText objectAtIndex:idx];
    NSLog(@"%@", data);
    id x = [NSNumber numberWithFloat:0+idx*0.002777778];
    id y = [NSDecimalNumber decimalNumberWithString:data];          
    [contentArray addObject:
    [NSMutableDictionary dictionaryWithObjectsAndKeys:x, @"x", y, @"y", nil]];    
}

self.dataForPlot = contentArray;

然后,我尝试从 CSV 文件加载数据,Data.csv 文件中的数据具有相同的值和相同的格式:

995,995,995,995,995,995,995,995,1000,997,995,994,992,993,992,989,988,987,990,993,989. 

我运行代码,它应该给出相同的图形输出。但是,似乎没有成功从 CSV 文件加载数据。
我无法弄清楚我的代码有什么问题。

NSMutableArray *contentArray = [NSMutableArray array];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"csv"];
NSString *Data = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil ];    
if (Data)
{
    NSArray *myText = [Data componentsSeparatedByString:@","];
    NSInteger idx;    
    for (idx = 0; idx < myText.count; idx++) {
        NSString *data =[myText objectAtIndex:idx];
                    NSLog(@"%@", data);
        id x = [NSNumber numberWithFloat:0+idx*0.002777778];
        id y = [NSDecimalNumber decimalNumberWithString:data];        
        [contentArray addObject:
        [NSMutableDictionary dictionaryWithObjectsAndKeys:x, @"x", y, @"y",nil]];    
    }
    self.dataForPlot = contentArray;

}

唯一的区别是

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"csv"];
NSString *Data = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil ];   
if (data){
}

我在这里做错了吗?

【问题讨论】:

  • 请记录pathForResource:ofType:stringWithContentsOfFile:encoding:error: 的返回值并编辑您的问题以包含输出。也请停止抑制该错误返回 - 将 error:nil 更改为 error:&amp;nameOfAVariableYouCreateToHoldAnNSErrorObject 并记录该对象,并编辑您的问题以包含 that 输出。框架经常试图告诉你你做错了什么。当您将NULL(或nil)传递给错误返回时,您会阻止他们这样做。
  • 作为一种风格,我可以建议“数据”不是最有意义的变量名称,并且有两个不同的变量名为“数据”和“数据”是完全令人困惑的。 +1 表示“不要忽略错误返回,它可能试图告诉你一些事情”
  • 调用字符串变量“data”本身就令人困惑,因为有一个 NSData 类,而且我更可能将一个变量命名为“data”,如果它包含一个 NSData 对象.

标签: ios iphone cocoa-touch csv nsstring


【解决方案1】:

我设置了一个示例项目并尝试了这段代码,它工作正常。

两个最可能的错误点是

  1. 您没有获得文件路径(即 filePath 为 nil)
  2. 您没有正确读取文件。

我建议添加:

NSLog( @"filePath: %@", filePath );

NSLog( @"Data: %@", Data );

和变化:

NSString *Data = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil ];

NSError* 错误; NSString* Data = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error ];

然后添加:

NSLog( @"error: %@", error );

当然,通过调试器运行它并检查返回值应该也能正常工作,并让您确切知道哪里出错了。

【讨论】:

  • 感谢您的帮助!!!是的,我跟踪了数据文件的位置,并确保我得到了正确的路径。它有效!
猜你喜欢
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多