我对iOS开发非常陌生。我正在尝试解析一个简单的csv文件,该文件具有大约10行,以逗号分隔。我正在使用下面的代码,但无法理解为什么NSScanner
解析字段(以下代码中的字段)时不转到逗号后的下一个字符串。我必须执行这条线
[fields scanCharactersFromSet:fieldCharSet intoString:nil];
使它超过分隔符。但是,我不必对行执行相同的操作-
NSScanner
自动将位置设置为换行符之后的下一行。在这两种情况下,我都使用相同的方法-[lines scanUpToCharactersFromSet:intoString]我不了解某些内容吗?这是我要解析的测试文件:
Name,Location,Number,Units
A,AA,4,mm
B,BB,3.5,km
C,CC,10.2,mi
D,DD,2,mm
E,EE,6,in
F,FF,2.8,m
G,GG,3.7,km
H,HH,4.3,mm
I,II,4,km
这是我的代码:
-(void)parseFile {
NSCharacterSet *lineCharSet = [NSCharacterSet newlineCharacterSet];
NSCharacterSet *fieldCharSet = [NSCharacterSet characterSetWithCharactersInString:self.separator];
// import the file
NSStringEncoding *encoding = nil;
NSError *error = nil;
NSString *data = [[NSString alloc] initWithContentsOfURL:self.absoluteURL usedEncoding:encoding error:&error];
NSString *line,*field;
NSScanner *lines = [NSScanner scannerWithString:data];
while (![lines isAtEnd]) {
[lines scanUpToCharactersFromSet:lineCharSet intoString:&line];//automatically sets to next line - why?
NSLog(@"%@\n",line);
NSScanner *fields = [NSScanner scannerWithString:line];
while (![fields isAtEnd]) {
[fields scanUpToCharactersFromSet:fieldCharSet intoString:&field];
[fields scanCharactersFromSet:fieldCharSet intoString:nil]; //have to do this otherwise will not go to next symbol
NSLog(@"%@\n", field);
}
}
}
最佳答案
这就是NSScanner
起作用的方式。当您使用scanUpToCharactersFromSet:intoString:
时,它最多扫描字符,但不包括字符集中的字符。如果希望它移动到集合中的字符之后,则有两个选择:
scanCharactersFromSet:intoString:
进行此操作。您可以执行的另一种方法是[fields scanString:self.separator intoString:nil]
。 setCharactersToBeSkipped:
告诉扫描程序要跳过分隔符。但是,这将使您很难检测到空白字段。 扫描仪的默认要跳过的字符集包括换行符。这就是外部扫描仪跳过换行符的原因。
您可以完全使用
componentsSeparatedByString:
来完成此操作,而不是使用NSScanner
。例:-(void)parseFile {
NSString *data = [[NSString alloc] initWithContentsOfURL:self.absoluteURL usedEncoding:encoding error:&error];
for (NSString *line in [data componentsSeparatedByString:@"\n"]) {
if (line.length == 0)
continue;
NSLog(@"line: %@", line);
for (NSString *field in [line componentsSeparatedByString:self.separator]) {
NSLog(@" field: %@", field);
}
}
}