【问题标题】:ios read csv file at project directoryios读取项目目录下的csv文件
【发布时间】:2014-06-19 07:34:09
【问题描述】:

我已经实现了读取csv文件的模块

项目结构如下:

Project
 --test_de.csv
 --Folder
   --Controller.h
   --Controller.m

但结果显示没有响应。没有添加任何单词:

2014-06-19 15:32:16.817 marker[1748:60b] /var/mobile/Applications/E2B95450-429D-4777-97BE-0209522EFDEF/Documents/test_de.csv
2014-06-19 15:32:16.824 marker[1748:60b] (
)

下面是我的代码

    NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* fullPath = [paths objectAtIndex:0];
    fullPath = [fullPath stringByAppendingPathComponent:@"test_de.csv"];
    NSLog(@"%@", fullPath);

 NSMutableArray *titleArray=[[NSMutableArray alloc]init];

    NSString *fileDataString=[NSString stringWithContentsOfFile:fullPath encoding:NSUTF8StringEncoding error:nil];
    NSArray *linesArray=[fileDataString componentsSeparatedByString:@"\n"];


    int k=0;
    for (id string in linesArray)
        if(k<[linesArray count]-1){

            NSString *lineString=[linesArray objectAtIndex:k];
                NSLog(@"%@",lineString);
            NSArray *columnArray=[lineString componentsSeparatedByString:@"\n"];
            [titleArray addObject:[columnArray objectAtIndex:0]];
            k++;

        }

    NSLog(@"%@",titleArray);

【问题讨论】:

    标签: ios iphone csv


    【解决方案1】:

    提示:使用 JSON!

    您最好为您的资源使用 JSON 格式而不是 CVS - 无论此资源是在运行时来自后端还是在构建时已作为应用程序资源嵌入。

    您可以使用 iOS 系统 JSON 解码器将文件解析为对象表示。这使您免于实现自己的 CVS 解析器的许多麻烦。

    此外,在将 CVS 中提供的任何输入作为资源实际提供给应用程序之前,将其转换为 JSON 应该是一件轻而易举的事。

    如何读取应用资源?

    好吧,首先确保您的资源文件包含在项目中并已分配目标(请参阅“文件检查器”窗格中的“目标成员资格”)。您也可以在“构建”中的“复制捆绑资源”部分中检查这一点当您选择关联的目标时,目标编辑器中的“阶段”选项卡。您的文件应该在此处列出。

    假设您将给定文件作为应用程序资源,您应该使用Bundle 类来读取该资源。首先以 URL 形式获取其位置:

    (注意:我只在 Swift 中展示这个,并将 Objective-C 版本留作练习)

    斯威夫特:

    var fileUrl = Bundle.main.url(forResource: "test_de", withExtension: "json")
    

    这还假设资源位于 app 资源文件夹 的根文件夹中,这恰好是您将文件标记为资源时的默认情况。请注意,“应用程序资源文件夹”对您来说是“不透明的”,也就是说,实际上您不需要知道它在哪里 - Bundle 会为您处理所有这些。

    对于 Objective-C,你可以在这里阅读:NSBundle

    现在,您有了 URL,读取文件并获取一个 Data 对象:

    斯威夫特:

    let data = try Data(contentsOf: fileUrl)
    

    对于 Objective-C,你可以在这里阅读:NSData

    为您的资源获取对象表示

    一旦您将文件作为数据(NSDataData),并假设其内容是 JSON 数组,您可以获得如下对象表示:

    目标-C:

    NSError *error = nil;
    id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];
    
    if ([jsonObject isKindOfClass:[NSArray class]]) {
        ...
    }
    else {
        NSLog(@"did not find a JSON Array");
        ...
    }
    

    斯威夫特:

    快速完成需要您定义一个类型 (struct),它表示 JSON 数组中的一个元素。通常,这很容易实现:

    struct MyElement: Codable {
        let field1: String 
        let field2: String 
        let field3: String   
    }
    

    然后,使用 Swift JSON 解码器获取 MyElements 的数组:

    let elements = try JSONDecoder.decode([MyElement].self, from: data)
    

    【讨论】:

      【解决方案2】:

      根据SoulWithMobileTechnology这是怎么做的

       [self readTitleFromCSV:csvPath  AtColumn:0];
      

      我们的方法如下所示:

      -(void)readTitleFromCSV:(NSString*)path AtColumn:(int)column
      {
      
      
          titleArray=[[NSMutableArray alloc]init];
      
          NSString *fileDataString=[NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
          NSArray *linesArray=[fileDataString componentsSeparatedByString:@"\n"];
      
      
          int k=0;
          for (id string in linesArray)
          if(k<[linesArray count]-1){
      
          NSString *lineString=[linesArray objectAtIndex:k];
          NSArray *columnArray=[lineString componentsSeparatedByString:@";"];
          [titleArray addObject:[columnArray objectAtIndex:column]];
          k++;
      
          }
      
          NSLog(@"%@",titleArray);
      
      }
      

      【讨论】:

      猜你喜欢
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      相关资源
      最近更新 更多