我看了这个,我几乎得到了它,但我有一个剩余的运行时错误 我的代码如下:
while ((line = reader.ReadLine()) != null)
{
while (reader.Peek() != '\r')
{
datalinestream.Add(GetWord(reader));
}
LuceneDB.AddUpdateLuceneIndex(new MATS_Doc( datalinestream));
datalinestream.Clear();
}
代码正在导入数据但循环不会中断,并且会因以下内容而崩溃
“发生了'System.OutOfMemoryException'类型的未处理异常 在mscorlib.dll“
外部while循环的适当中断条件是什么,以确保我读取整个文件并在结束时中断。我很难解决这个问题,因为我需要前进到下一行,我需要跳过电子表格中的第一行。任何帮助非常感谢。
*的 更新 *
我清除了字符串列表,因为我正在为lucene索引创建一个doc,它只有大约14个字段,我不希望列表变得太大。
我的getword代码
private string GetWord(TextReader inputdata)
{
String word = "";
while (inputdata.Peek() >= 0)
{
word += (char)inputdata.Read();
if ((word.Contains(";"))) break;
}
return word;
}
答案 0 :(得分:6)
我猜GetWord
并没有推动读者 - 导致datalinestream
变得庞大。
或者你的档案非常庞大。
出于兴趣 - 你为什么要扔掉line
? - 当然包含你在内循环上尝试阅读的所有文本?
<强>更新强>
代码中某处肯定存在逻辑漏洞,我的猜测是要么将-1
或0
个字符添加到列表中,要么添加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();
}
正如我所说的 - 不要丢掉你刚读过的那条线 - 使用它,利用它也剥离换行的事实。然后简单地使用string.Split
来破解每个单词,在过程中修剪它们以消除它们可能具有的任何尾随/前导空格。
答案 1 :(得分:1)
这可能会导致异常
while (reader.Peek() != '\r')
{
datalinestream.Add(GetWord(reader));
}