如何从文本文件中读取很长的字符串,然后对其进行处理(拆分为单词)?
我尝试过StreamReader.ReadLine()
方法,但我得到了OutOfMemory
例外。显然,我的队伍非常长。
这是我的读取文件的代码:
using (var streamReader = File.OpenText(_filePath))
{
int lineNumber = 1;
string currentString = String.Empty;
while ((currentString = streamReader.ReadLine()) != null)
{
ProcessString(currentString, lineNumber);
Console.WriteLine("Line {0}", lineNumber);
lineNumber++;
}
}
以及将行分割成单词的代码:
var wordPattern = @"\w+";
var matchCollection = Regex.Matches(text, wordPattern);
var words = (from Match word in matchCollection
select word.Value.ToLowerInvariant()).ToList();
您可以按字符阅读,边读边构建单词,使用yield
使其延迟,这样您就不必立即读取整个文件:
private static IEnumerable<string> ReadWords(string filename)
{
using (var reader = new StreamReader(filename))
{
var builder = new StringBuilder();
while (!reader.EndOfStream)
{
char c = (char)reader.Read();
// Mimics regex /w/ - almost.
if (char.IsLetterOrDigit(c) || c == '_')
{
builder.Append(c);
}
else
{
if (builder.Length > 0)
{
yield return builder.ToString();
builder.Clear();
}
}
}
yield return builder.ToString();
}
}
该代码按字符读取文件,当遇到非单词字符时,它将yield return
直到那时为止建立的单词(仅适用于第一个非字母字符)。该代码使用了一个StringBuilder
构建单词字符串。
Char.IsLetterOrDigit() https://msdn.microsoft.com/en-us/library/system.char.isletterordigit(v=vs.110).aspx行为就像正则表达式单词字符w https://msdn.microsoft.com/en-us/library/20bw873z(v=vs.110).aspx#WordCharacter对于字符,但下划线(除其他外)也属于后一类。如果您的输入包含更多您还希望包含的字符,则必须更改if()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)