c#无法读取(非常大)文本文件(IndexOutOfRange)

时间:2015-10-02 15:09:18

标签: c# file text indexoutofboundsexception

我的目的是读取文本文件(<50 mb)并对其执行正则表达式,然后将其保存回另一个文件(在c#中)。我如何做到这一点发布在下面。

 Regex regex = new Regex(@"\s{2,}");
var lines = File.ReadLines(path);
        foreach (var line in lines)
        {
            Console.WriteLine(regex.Split(line,2)[1]);
            File.WriteAllText(regex.Split(line,2)[1]);                    
        }

当我尝试使用小文件(140KB)时,它可以正常工作。 当我使用大小约为50 MB的文件运行相同时,它会崩溃 在循环中执行正则表达式有什么用吗?

IndexOutOfRange是抛出的异常。我无法理解的是45mb文件如何运行我的系统内存?我安装了8台RAM。

3 个答案:

答案 0 :(得分:1)

必须有一行regex.Split(line,2)[1]为空。添加支票

 Regex regex = new Regex(@"\s{2,}");
 var lines = File.ReadLines(path);

 foreach (var line in lines)
 {
     var item = regex.Split(line,2);
     if(item.Length > 1)
     {
          Console.WriteLine(regex.Split(line,2)[1]);
          File.WriteAllText(regex.Split(line,2)[1]);   
     }                 
 }

它应该有效

答案 1 :(得分:0)

当您尝试访问不存在的数组索引时,抛出

IndexOutOfRange。您的代码对Split()调用返回的数组具有数组访问权限。因此,当Split()返回一个少于2个元素的数组,使得索引1无效时,很可能会失败。请注意,Split的第二个参数只是最大分割数:没有最小值。您可能希望对输入执行其他验证,或执行类似.Last()而不是[1]的操作。

答案 2 :(得分:0)

在通过引用不正确的索引修复第一个问题之后,您将在循环中不断调用File.WriteAllText时遇到问题。这解决了这两个问题,并没有继续打开/关闭目标文件。

Regex regex = new Regex(@"\s{2,}");
File.WriteAllLines(path2,File.ReadLines(path).Select(line=>{
  var items=regex.Split(line,2);
  return items.Length>1?item[1]:"";
}));