你好我的朋友我需要你的帮助! :)我是斯威夫特的绝对初学者,完全不知道我在做什么。
我需要从转换为字符串的txt文件中提取所有数字。 我想将所有数字保存到一个新数组中,我还必须使用CharacterView来解决问题。
这是我到目前为止所得到的。从txt文件中读取没有问题。
func readFile(){
let path = Bundle.main.path(forResource: "paragraph", ofType: "txt")
var fileContents : String? = nil
do {
fileContents = try String(contentsOfFile: path!, encoding: String.Encoding.utf8)
} catch _ as NSError {
//ERROR HANDLING
}
print(fileContents)
}
这是文件:
§9Lorem ipsum dolor(1)坐在amet,consetetur sadipscing elitr,sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam。 (2)bed diam voluptua。在vero eos et accusam et justo duo 55 dolores 等等。 Stet clita kasd gubergren。 (3)1 abore et dolore magna Aliquyam erat,sed diam voluptua。在vero eos et accusam et justo duo dolores et ea rebum。 Stet clita kasd。
感谢您的时间!
答案 0 :(得分:1)
这是一种简单的方法,不幸的是它没有使用CharacterView
因为这会使它复杂化:
func readFile(){
// Make sure getting the path and reading the file succeeds
guard
let path = Bundle.main.path(forResource: "paragraph", ofType: "txt"),
let fileContents = try? String(contentsOfFile: path, encoding: String.Encoding.utf8)
else { return }
// split string into substrings that only contain numbers
let substrings = fileContents.components(separatedBy: CharacterSet.decimalDigits.inverted)
// flatMap performs action on each substring
// and only returns non-nil values,
// thus returns [Int]
let numbers = substrings.flatMap {
// convert each substring into an Int?
return Int($0)
}
print(numbers)
}
由于Int
的初始化程序需要String
,因此无需使用CharacterView
。一旦文本中的数字与非数字分开,就可以直接从String
转换为Int
。使用CharacterView
将是一个不必要的中间人。但是,您可以编写自己的Int
init?(String)
版本,该版本使用CharacterView
来构建值。
答案 1 :(得分:0)
import Foundation
extension String {
func onlyNumbers() -> [NSNumber] {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
let charset = CharacterSet.init(charactersIn: " ,")
return matches(for: "[+-]?([0-9]+([., ][0-9]*)*|[.][0-9]+)").compactMap { string in
return formatter.number(from: string.trimmingCharacters(in: charset))
}
}
// https://stackoverflow.com/a/54900097/4488252
func matches(for regex: String) -> [String] {
guard let regex = try? NSRegularExpression(pattern: regex, options: [.caseInsensitive]) else { return [] }
let matches = regex.matches(in: self, options: [], range: NSMakeRange(0, self.count))
return matches.compactMap { match in
guard let range = Range(match.range, in: self) else { return nil }
return String(self[range])
}
}
}
let text = "dasdxcw 12345678 eadwd 333.222 reqw 3 333 444.22, sfsa 44. qewqwdsaw qe aw, 0.123456678 and .23 asdasdas 32,322,222,444.8"
print("Original text: \(text)")
print("Only numbers: \(text.onlyNumbers())")
//Original text: dasdxcw 12345678 eadwd 333.222 reqw 3 333 444.22, sfsa 44. qewqwdsaw qe aw, 0.123456678 and .23 asdasdas 32,322,222,444.8
//Only numbers: [12345678, 333.222, 3333444.22, 44, 0.123456678, 0.23, 32322222444.8]