我有一个大文本文件(大约10 MB)。在文本文件中有一些值(没有行之间的空行,我无法在此正确格式化):
;string1;stringValue1;
;string2;stringValue2;
;string3;stringValue3;
;string4;stringValue4;
我正在使用一个非常丑陋的解决方案将所有'stringX'值解析为一个数组,并将'stringValueX'解析为另一个字符串:
words = [rawText componentsSeparatedByString:@";"];
NSEnumerator *word = [words objectEnumerator];
while(tmpWord = [word nextObject]) {
if ([tmpWord isEqualToString: @""] || [tmpWord isEqualToString: @"\r\n"] || [tmpWord isEqualToString: @"\n"]) {
// NSLog(@"%@*** NOTHING *** ",tmpWord);
}else { // here I add tmpWord the arrays...
我尝试使用NSScanner
按照以下示例执行此操作:http://www.macresearch.org/cocoa-scientists-part-xxvi-parsing-csv-data
但是我收到了内存警告然后全部崩溃了。
我应该使用NSScanner
执行此操作,如果是这样,有人可以举例说明如何执行此操作吗?
谢谢!
答案 0 :(得分:0)
您应该使用快速枚举。它比使用objectEnumerator
的好得多。试试这个
for (NSString *word in words) {
// do the thing you need
}
答案 1 :(得分:0)
在大多数情况下,NSScanner
比componentsSeparatedByString:
更适合,尤其是在您尝试保留记忆的情况下。
你的文件可以用这样的循环解析:
while (![scanner isAtEnd]) {
NSString *firstPart = @"";
NSString *secondPart = @"";
[scanner scanString: @";" intoString: NULL];
[scanner scanUpToString: @";" intoString: &firstPart];
[scanner scanString: @";" intoString: NULL];
[scanner scanUpToString: @";" intoString: &secondPart];
[scanner scanString: @";" intoString: NULL];
// TODO: add firstPart and secondPart to your arrays
}
如果收到无效文件,您可能需要在此处添加错误检查代码。