Objective c 我需要帮助根据字符串是否包含给定的子字符串来解析.csv文件,并将该字符串保存到Objective C中的新文件中

Objective c 我需要帮助根据字符串是否包含给定的子字符串来解析.csv文件,并将该字符串保存到Objective C中的新文件中,objective-c,file,parsing,csv,substring,Objective C,File,Parsing,Csv,Substring,基本上,我是在搜索食物清单。我在.csv文件中使用的字段是:食物的名称,用数字表示的食物类型(食物类型是肉、蔬菜、水果等)。我想逐行检查.csv文件,如果食物类型是水果(由数字1表示),那么我想将整行保存在一个新文件中。我想浏览整个食物列表,并将每个食物保存到新文件中。我怎样才能在目标c中这样做呢?我的想法是在字符串中搜索一个子字符串(在本例中为数字1),如果它包含该子字符串,则我希望将整行保存在一个名为FROUT的新文件中。我在理论上理解这一点,但我在理解如何以这种方式解析.csv文件时遇到困

基本上,我是在搜索食物清单。我在.csv文件中使用的字段是:食物的名称,用数字表示的食物类型(食物类型是肉、蔬菜、水果等)。我想逐行检查.csv文件,如果食物类型是水果(由数字1表示),那么我想将整行保存在一个新文件中。我想浏览整个食物列表,并将每个食物保存到新文件中。我怎样才能在目标c中这样做呢?我的想法是在字符串中搜索一个子字符串(在本例中为数字1),如果它包含该子字符串,则我希望将整行保存在一个名为FROUT的新文件中。我在理论上理解这一点,但我在理解如何以这种方式解析.csv文件时遇到困难。

NJones是正确的-csv文件很糟糕,而且在Objective-C中你不经常看到它们,所以尽量避免它们

但是,您可以使用以下代码加载CSV文件:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"food" ofType:@"csv"];
NSString *fileContents = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];
如果CSV的内容存储在内存中(来自磁盘上的文件或web服务),则可以将其转换为行记录数组:

NSArray *lines = [fileContents componentsSeparatedByString:@"\n"];
CSV文件中的第一行通常是标题,但删除(或忽略)后,只需对其余行进行枚举即可

for (NSString *record in lines) {
    NSArray *values = [record componentsSeparatedByString:@","];
    //values is now an array of the contents of the CSV file. Do stuff with it.
}

这段代码假设了很多关于CSV文件结构的信息,例如食物名称中没有逗号,等等。一般来说,尽可能避免使用CSV文件。考虑将数据作为JSON或更好的方式作为核心数据存储保存在磁盘上。

如果您的csv文件非常简单,并且具有定义良好的格式,那么根据@Ash Furrow的建议,您可能会很幸运地使用自己的代码

如果您面临更复杂的导入,您可能会发现Matt Gallagher创建的教程和CSV解析类非常有用。他创造了一个处理CSV文件的好方法,做得非常好。您可以在这里查看:http://cocoawithlove.com/2009/11/writing-parser-using-nsscanner-csv.html-(BOOL)readFromURL:(NSURL*)类型的绝对URL:(NSString)类型名称错误:(NSError*)外部错误

{


}

CSV很烂。如果有人想就如何处理这个案件给你提供合理的好建议,你应该至少发布文件的前几行。或者更好的办法是看看你是否可以在JSON中获得相同的信息。我不知道他为什么如此讨厌CSV文件,但代码灰沟列表本质上是你需要的——而不是火箭科学。我必须从经验中了解CSV有多糟糕——这段代码是在放弃该项目两年后直接从该项目中复制的:)
NSString *fileString = [NSString stringWithContentsOfURL:absoluteURL 
                                                encoding:NSUTF8StringEncoding error:outError];

NSLog(@"------- file string ----- %@",fileString);
if ( nil == fileString )
    return NO;
 NSArray* allLinedStrings = 
[fileString componentsSeparatedByCharactersInSet:
 [NSCharacterSet newlineCharacterSet]];   
 NSLog(@"------- file string ----- %@",allLinedStrings); 

// write your code how you want display