逐行解析文本的最快方法
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 关于使用适当解析器的建议。
我正在尝试使用 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 关于使用适当解析器的建议。