0

我查了一下,我几乎明白了,但我还有一个剩余的运行时错误。
我的代码如下:

while ((line = reader.ReadLine()) != null)
{
    while (reader.Peek() != '\r')
    {
        datalinestream.Add(GetWord(reader));
    }
    LuceneDB.AddUpdateLuceneIndex(new MATS_Doc( datalinestream));
    datalinestream.Clear();
}

代码正在导入数据,但循环不会中断,并且由于以下原因会崩溃

“在 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;
    }
4

2 回答 2

6

我猜GetWord不是在推进读者 - 导致datalinestream变得庞大。

或者你的文件真的很大。

出于兴趣——你为什么要扔掉line?- 肯定包含您在内部循环中尝试阅读的所有文本?

更新

您的代码中肯定有一个逻辑漏洞,我的猜测是它要么向列表中添加-10字符,要么是内部字符串GetWord(顺便说一句,+=以这种方式在字符串上使用对于性能和内存使用来说是可怕的)。也可能是您的线路终止符\r不仅仅是 'naked' \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();
}

正如我所说——不要扔掉你刚刚读到的那一行——使用它,利用它也去掉换行符的事实。然后简单地使用string.Split来破解每个单词,在此过程中修剪它们以消除它们可能具有的任何尾随/前导空格。

于 2013-03-13T11:31:32.303 回答
1

这可能会导致异常

     while (reader.Peek() != '\r')
      {
       datalinestream.Add(GetWord(reader));
      }
于 2013-03-13T11:32:25.240 回答