【问题标题】:Find a String in a huge text file在巨大的文本文件中查找字符串
【发布时间】:2021-01-21 23:43:52
【问题描述】:

我正在开发一个内部应用程序,它将在一个文本文件(约 60,000 行)中搜索内容。 用户将在他的 iPhone 上的 UISearchBar 中键入一个字符串,应用程序将返回该字符串所在的行。

我就是这样做的。

首先,我将文本文件拆分为一个名为 entriesInLine 的数组:

    var entriesInLine: [String] = []

    let fileWithEntries = NSBundle.mainBundle().pathForResource("database", ofType: "txt")
    var entriesFromFile = String(contentsOfFile: fileWithEntries!, encoding: NSUTF8StringEncoding, error: nil)

    if let content = entriesFromFile {
        self.entriesInLine = content.componentsSeparatedByString("\n")
        println(self.entriesInLine.count)
    }

然后我希望用户能够使用 UISearchBar 搜索数据库。这是我的搜索方法:

 func filterEntries(searchText: String) {
    for var i = 0; i < self.entriesInLine.count; i++  {
        if ( self.entriesInLine[i].rangeOfString(searchText) != nil) {
            self.filteredEntries.append(extractEntry(entriesInLine[i]))                            

        }

这是我的 searchDisplayController 方法:

func searchDisplayController(controller: UISearchDisplayController!, shouldReloadTableForSearchString searchString: String!) -> Bool {
    self.filterEntries(searchString)

}

一切正常,但速度太慢,因为数组很大。

您知道在我的文本文件中搜索内容的更快方法吗?

非常感谢您的帮助!

谢谢

【问题讨论】:

  • 尝试改变你在数组中搜索和存储的逻辑。在数组中存储比查找字符串要花费很多时间。
  • 谢谢。所以现在我使用 self.entriesFromFile!.rangeOfString(searchText) 直接将文件作为字符串读取。现在搜索东西要快得多,但我无法获取行号来提取它。我该怎么办,也许使用扫描仪?
  • 什么范围的字符串返回字符串的位置或该字符串的计数?
  • 我可以得到找到的字符串的范围,但不能得到当前行的编号
  • 在范围内您从字符串开始的位置获取位置?与 range.location

标签: ios swift uisearchbar


【解决方案1】:

试试这个我已经测试过。

 var bundle: NSString = NSBundle.mainBundle().pathForResource("File", ofType: "")!
 var entriesFromFile: NSString = NSString.stringWithContentsOfFile(bundle, encoding: NSUTF8StringEncoding, error: &attributeError) as NSString
 var range: NSRange = entriesFromFile.rangeOfString("rrr")
 var substring: NSString = entriesFromFile.substringToIndex(range.location)
 var arr: NSArray = substring.componentsSeparatedByString("\n")

 print("Occurence of String in File on Line Number", arr.count)

【讨论】:

  • 太好了。非常感谢您的工作。我不得不使用 entriesFromFile = NSString(contentsOfFile: bundle, encoding: NSUTF8StringEncoding, error: nil)!作为 NSString 因为在我的 Xcode 中 stringWithContentsOfFile 已被弃用。它运作良好!但有时我会收到此错误:*** 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[__NSCFString substringToIndex:]: Index 9223372036854775807 out of bounds;字符串长度 7098003' 我猜索引变大了。当我更改搜索文本时,这发生在我的 UISearchBar 中。
  • 不使用子字符串,而是在读取文件时,构建每行开头的数组(0,每个 \n +1 的位置)。当您获得字符串中单词的偏移量时,只需对数组范围内的行进行二进制搜索。比每次都剪断绳子要快。
  • 如果我在执行 substringToIndex 之前测试 if range.length != 0 一切正常
猜你喜欢
  • 1970-01-01
  • 2016-05-30
  • 2015-07-14
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多