2010-03-15 101 views
1

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

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){ 
} 

难道我做错什么事吗?

+2

请记录'pathForResource:ofType:'和'stringWithContentsOfFile:encoding:error:'的返回值并编辑您的问题以包含输出。还请停止将错误return-error'error:nil'抑制为'error:&nameOfAVariableYouCreateToHoldAnNSErrorObject'并记录该对象,并编辑您的问题以包含* that *输出。框架经常试图告诉你你做错了什么;当你将'NULL'(或'nil')传递给错误返回时,你会阻止它们这样做。 – 2010-03-15 04:12:00

+2

作为一种风格,我可以建议“数据”不是最有意义的变量名称,并且有两个不同的变量,分别命名为“数据”和“数据”是彻头彻尾的混淆。 +1为“不要忽略错误返回,它可能试图告诉你的东西” – 2010-03-15 04:28:56

+1

调用一个字符串变量“数据”是自己混淆,因为有一个NSData类,而我,作为一个,如果它包含一个NSData对象,则更有可能命名变量“data”。 – 2010-03-15 04:36:19

回答

9

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

两个错误的最可能的点是

  1. 你没有得到的文件路径(即filepath是零)
  2. 你是不是正确读取文件。

我建议增加:

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

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

和改变:

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

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

,然后补充说:

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

当然,通过调试器运行并检查返回值应该也可以正常工作,并让您确切地知道它失败的位置。

+0

感谢您的帮助! 是的,我跟踪了数据文件的位置,并确保我得到正确的路径。有用!! – 2010-03-15 17:23:14

+2

太好了。不要忘记将这个问题标记为已回答。 – ericg 2010-03-15 18:59:01