gpt4 book ai didi

iphone - NSScanner 行为

转载 作者:行者123 更新时间:2023-11-29 11:16:11 26 4
gpt4 key购买 nike

我是 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: 时,它最多扫描字符 但不包括 集合中的字符。如果您希望它移过集合中的字符,您有两个选择:

  1. 让它扫描那些字符。您现在正在使用 scanCharactersFromSet:intoString: 执行此操作。另一种方法是 [fields scanString:self.separator intoString:nil]

  2. 使用 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);
}
}
}

关于iphone - NSScanner 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9353764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com