尽量避免两次读取文件

本文关键字:两次 读取 文件 | 更新日期: 2023-09-27 18:28:11

我正在解析一个大小可达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"之间的内容,但这里是输入的示例。我应该得到两个块或字符串,每个块或字符串以"Module-N#"开头,因为那些带有fc-mac的行以"show"开头,但不在我想要捕获的列表中,所以代码认为这是一个新块,它们不会被捕获。在这一点上,我想知道一个单独的方法来处理这个新部件,只需读取两次文件。if/else语句已经相当复杂了。

模块-1#显示硬件内部错误

show hardware internal fc-mac port 1 interrupt-counts

show hardware internal fc-mac port 2 interrupt-counts

模块-2#显示硬件内部错误

show hardware internal fc-mac port 1 interrupt-counts

show hardware internal fc-mac port 2 interrupt-counts

尽量避免两次读取文件

如果您遇到性能问题,您的条件语句比磁盘读取要便宜得多,因此读取两次文件最终会降低性能。

现在,复杂的条件语句确实降低了可维护性,并引入了错误的可能性。

你可以做的是,你可以将文件读取到内存中(只需将所有行加载到一个数组中。),读取两次文件所需的时间会更短,但你会使用更多的内存。