我有一个显示日志的NSTextView(价值超过15 MB的文本)。日志中将有时间戳。示例摘录:
728.0089896878
我有一个带有时间戳的下拉菜单。时间戳是具有以下格式的字符串:
2018-04-22 07:54:49 <Homebound> [tests > ... Ending
2018-04-22 07:54:49 <Homebound> [tests > ... Starting
launchctl load /System/Library/
2018-04-22 07:54:50 (null)
目前,我可以从下拉菜单中选择时间戳,并在NSTextView中找到时间戳,并滚动到时间戳所在的位置。这是代码:
2018-04-22 07:54:49
我遇到的问题是确切的时间戳可能不在NSTextView中显示的日志中。如何在NSTextView中找到最接近的时间戳并滚动到它?
答案 0 :(得分:0)
一种方法是在时间戳上构建某种索引:
var index: [String: [Range<String.Index>]]
var timestamps: [String]
index
+并将其附加到timestamps
timestamps
中查找:
timestamps
上使用二进制搜索获取最近的搜索并在index
您可能希望将此索引作为后台任务。
答案 1 :(得分:0)
我分几个步骤操作。
代码如下:
let str = <your string>
var closestRange = NSRange(location: NSNotFound, length: 0)
var smallestDelta : TimeInterval = TimeInterval.infinity
let refTimeInterval = <Date from the text field>.timeIntervalSinceReferenceDate
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "YYYY-MM-dd HH:mm:ss"
if let regex = try? NSRegularExpression(pattern: "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}", options: []) {
for match in regex.matches(in: str, options: [], range: NSRange(location: 0, length: (str as NSString).length)) {
let range = match.range(at: 0)
let substring = (str as NSString).substring(with: range)
if let date = dateFormatter.date(from: substring) {
let delta = abs(date.timeIntervalSinceReferenceDate - refTimeInterval)
if delta < smallestDelta {
closestRange = range
smallestDelta = delta
}
}
}
}
print(closestRange)
正则表达式是一个很长的主题,但很容易找到有关它们的信息,例如:https://www.raywenderlich.com/86205/nsregularexpression-swift-tutorial
当然,某种形式的索引会更好,但我想问题的主要部分是隔离日期并将它们转换为正确的日期。