The*_*ice 0 c# streamreader while-loop
我看了这个,我几乎得到了它,但我有一个剩余的运行时错误.
我的代码如下:
while ((line = reader.ReadLine()) != null)
{
    while (reader.Peek() != '\r')
    {
        datalinestream.Add(GetWord(reader));
    }
    LuceneDB.AddUpdateLuceneIndex(new MATS_Doc( datalinestream));
    datalinestream.Clear();
}
Run Code Online (Sandbox Code Playgroud)
代码正在导入数据,但循环不会中断,并且由于以下原因而崩溃
"mscorlib.dll中发生了'System.OutOfMemoryException'类型的未处理异常"
外部while循环的适当中断条件是什么,以确保我读取整个文件并在结束时中断.我很难解决这个问题,因为我需要前进到下一行,我需要跳过电子表格中的第一行.任何帮助非常感谢.
*更新*
我清除字符串列表,因为我正在为lucene索引创建一个文档,它只有大约14个字段,我不希望列表变得太大.
我的getword代码
private string GetWord(TextReader inputdata)
        {
            String word = "";
            while (inputdata.Peek() >= 0)
            {
                word += (char)inputdata.Read();
                if ((word.Contains(";"))) break;
            }
        return word;
    }
Run Code Online (Sandbox Code Playgroud)
    我猜GetWord不是推进读者 - 导致datalinestream大规模.
或者您的文件非常庞大.
出于兴趣 - 你为什么要扔掉line? - 当然,它包含你试图在内循环上读取的所有文本?
更新
在你的代码中某处必须有一个逻辑漏洞,我的猜测是你要么在你的列表中添加-1或者是0chars,要么是内部字符串GetWord(顺便说一下,+=以这种方式使用字符串对于性能和内存使用来说是可怕的).也可能是你的线路终结器\r不仅仅是'裸体' \n.
也就是说,你可以通过这样做解决所有问题:
string line = reader.ReadLine();
string wordTemp;
while(line != null)
{
  string[] words = 
    line.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
  foreach(var word in words)
  {
    wordTemp = word.Trim(); //get rid of any whitespace
    if(wordTemp.Length != 0)
      datalinestream.Add(wordTemp);
  }
  LuceneDB.AddUpdateLuceneIndex(new MATS_Doc( datalinestream));
  datalinestream.Clear();
  line = reader.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
就像我说的那样 - 不要丢掉你刚读过的那条线 - 使用它,利用它也剥离换行的事实.然后简单地string.Split用来破解每个单词,在过程中修剪它们以消除它们可能具有的任何尾随/前导空格.