我有一个格式类似于此的 CSV
"1.0","remainder1",
"2.0","remainder2",
"3.0","remainder3",
"4.0","remainder4",
"5.0","remainder5"
我希望使用以下方法扫描并打印这些值:
var textScanner: Scanner = Scanner(string: textToScan)
textScanner.charactersToBeSkipped = CharacterSet(charactersIn: "\",")
var value: Double = 0.0
var remainder: NSString?
while !textScanner.isAtEnd {
textScanner.scanDouble(&value)
textScanner.scanUpTo("\n", into: &remainder)
print("value \(value)")
print("remainder \(remainder)")
print("\n newline \n")
}
它正确地识别出 value
是一个 double ,而 remainder
是一个字符串。但它陷入了无限循环,一遍又一遍地打印相同的结果。
如果我从扫描 double 更改为扫描字符串,那么它会向前移动并正确完成:
textScanner.scanUpTo(",", into: &value)
但我真的想将第一个值直接扫描到 double
而不是 string
,然后将其转换回 double
特殊原因。
在我的第一个实现中我缺少什么来让它工作?
谢谢!
最佳答案
一些评论:
- 始终检查
scan...
的返回值,以确保它确实扫描了您的想法。 scanUpTo
不包括您正在扫描的字符串。所以扫描仪仍然指向换行符,而不是换行符之后的字符。- 只在需要的地方声明变量。
您的代码应该更像这样:
var textScanner: Scanner = Scanner(string: csv)
textScanner.charactersToBeSkipped = CharacterSet(charactersIn: "\",")
var cnt = 0 // for testing only
while !textScanner.isAtEnd {
var value: Double = 0.0
var remainder: NSString?
if textScanner.scanDouble(&value) && textScanner.scanUpTo("\n", into: &remainder) {
// Ignore the newline
textScanner.scanString("\n", into: nil)
print("value \(value)")
print("remainder \(remainder)")
print("\n newline \n")
} else {
print("oops")
}
// For testing to avoid infinite loop
cnt += 1
if cnt > 10 {
break
}
}
关于ios - Swift "Scanner"陷入死循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50195389/