我查了一下,我几乎得到了它,但我有这一个剩余的运行时错误。
我的代码如下:
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索引创建一个文档,它只有大约14个字段,我不希望列表变得太大。
getword
代码private string GetWord(TextReader inputdata)
{
String word = "";
while (inputdata.Peek() >= 0)
{
word += (char)inputdata.Read();
if ((word.Contains(";"))) break;
}
return word;
}
我猜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
来破解每个单词,在此过程中修剪它们,以消除它们可能具有的任何尾随/前导空格。
这可能会导致异常
while (reader.Peek() != 'r')
{
datalinestream.Add(GetWord(reader));
}