逐行解析文本的最快方法

Fastest way to parse a TXT line by line

我正在尝试使用 if 语句和 String.contains(String) 方法逐行解析 large TXT 文件(6mio.Lines,200MB) .目前很慢,请问有什么方法可以提高速度吗

我知道还有 String.firstIndexOf,但似乎速度较慢。正则表达式也可能更慢。

正在导入TXT和分割线:

   let content = try String(contentsOfFile:path, encoding: String.Encoding.ascii)
           print("LOADED 0");
           return content.components(separatedBy: "\n")

正在解析:

     if(line.contains("<TAG1>")) {
         var thisline = line;
         thisline = thisline.replacingOccurrences(of: "<TAG1>", with: "")
         thisline = thisline.replacingOccurrences(of: "</TAG1>", with: "")
         text = "\(text)\n\(thisline): ";
     } else if(line.contains("<TAG2>")) {
         var thisline = line;
         thisline = thisline.replacingOccurrences(of: "<TAG2>", with: "")
         thisline = thisline.replacingOccurrences(of: "</TAG2>", with: "")
         text = "\(text) - \(thisline) ";
     }

可能会有更多 if 语句(这可能会进一步减慢解析速度)

如果能提高速度就好了,大约需要。在我的 Macbook 上 5-10 分钟(取决于文件大小)

编辑:似乎 string + " \n " + string2 比 "(string) \n (string2)" 快,但帮助不大

Edit2:我在应用程序中添加了一个进度条,它似乎开始得很快,最后却变慢了?

按原样构建最终的 text 变量会导致为每一行复制一个不断增长的字符串(添加少量内容),然后重新分配回 text

// Slow
text = "\(text)\n\(thisline): "

将加法附加到原始变量会更快:

// Fast(er)
text.append("\n\(thisline): ")

根据所需的复杂程度(以及这只是一次性转换还是经常发生的事情?),您可能需要查看@rmaddy 关于使用适当解析器的建议。