我正在解析一个最大可达35MB的文本文件。
我目前有这段代码:
const string show_BLOCK_DELIMITER = "show ";
const string Show_BLOCK_DELIMITER = "Show ";
const string Begin_SHOW_HW_DELIMITER = @"show hardware internal errors";
以及控制捕获内容的逻辑:
if ((line == null) || (trimmed.StartsWith(show_BLOCK_DELIMITER))
|| (trimmed.StartsWith(Show_BLOCK_DELIMITER))
|| (trimmed.Contains(Begin_SHOW_HW_DELIMITER)))
{
//stuff happens here
}
我捕获的方式是读取文件,当我点击以“show”或“Show”开头的行时,我会检查它是否是我要捕获的内容。如果是这样,我开始捕捉,直到下一行以'show'或'Show'开头。新代码应该捕获常量'Begin_SHOW_HW_DELIMTER'之间的东西,除了这是输入的样本。我应该得到的是2个块或字符串,每个块以“Module-N#”开头,因为那些带有fc-mac的行以'show'开头但不在我要捕获代码的列表中认为这是一个新的块,他们不会被捕获。在这一点上,我想知道一个单独的方法来处理这个新的部分,只是读取文件两次。 if / else语句已经非常复杂了。
module-1#显示硬件内部错误
show hardware internal fc-mac port 1 interrupt-counts
show hardware internal fc-mac port 2 interrupt-counts
module-2#显示硬件内部错误
show hardware internal fc-mac port 1 interrupt-counts
show hardware internal fc-mac port 2 interrupt-counts
答案 0 :(得分:0)
如果您遇到性能问题,您的条件语句比磁盘读取便宜得多,因此读取文件两次最终会降低性能。
现在,复杂的条件语句会降低可维护性,并引入错误的可能性。
你可以做什么,是你可以将文件读入内存(只需将所有行加载到数组中。),读取文件两次会花费更少的时间,但你会使用更多的内存。