我有一个应用程序从文本文件中读取信息,然后对它们进行分类并将它们放到数据库中。对于一个类别,我需要检查当前行之后的行并查找某个关键字?
我如何阅读这一行?这应该在streamreader已经打开当前行时发生....
我在VS2010上使用c#。
修改:
下面的所有代码都在 中(!sReader.EndOfStream) 循环
string line = sReader.ReadLine(); //Note: this is used way above and lots of things are done before we come to this loop
for (int i = 0; i < filter_length; i++)
{
if (searchpattern_queries[i].IsMatch(line) == true)
{
logmessagtype = selected_queries[i];
//*Here i need to add a if condition to check if the type is "RESTARTS" and i need to get the next line to do more classification. I need to get that line only to classify the current one. So, I'd want it to be open independently *
hit = 1;
if (logmessagtype == "AL-UNDEF")
{
string alid = AlarmID_Search(line);
string query = "SELECT Severity from Alarms WHERE ALID like '" +alid +"'";
OleDbCommand cmdo = new OleDbCommand(query, conn);
OleDbDataReader reader;
reader = cmdo.ExecuteReader();
while (reader.Read())
{
if (reader.GetString(0).ToString() == null)
{ }
else
{
string severity = reader.GetString(0).ToString();
if (severity == "1")
//Keeps going on.....
此外,打开的.log文件可能达到50 Mb类型......!这就是为什么我真的不喜欢阅读所有线路并保持跟踪!
答案 0 :(得分:5)
这是一个在下一行已经可用的情况下处理当前行的习惯用法:
public void ProcessFile(string filename)
{
string line = null;
string nextLine = null;
using (StreamReader reader = new StreamReader(filename))
{
line = reader.ReadLine();
nextLine = reader.ReadLine();
while (line != null)
{
// Process line (possibly using nextLine).
line = nextLine;
nextLine = reader.ReadLine();
}
}
}
这基本上是队列,其中最多包含两个项目,或“一行预读”。
编辑简化。
答案 1 :(得分:4)
只需使用
string[] lines = File.ReadAllLines(filename);
并使用for (int i = 0; i < lines.Length; i ++)
循环处理文件。
对于大文件,只需缓存“上一行”或执行带外ReadLine()。
答案 2 :(得分:1)
你能再次拨打reader.ReadLine()
吗?或者您是否需要在循环的下一次迭代中使用该行?
如果它是一个相当小的文件,您是否考虑过使用File.ReadAllLines()
阅读整个文件?这可能会使它更简单,虽然在其他方面显然不那么干净,而且对于大文件来说更需要内存。
编辑:以下是一些代码:
using (TextReader reader = File.OpenText(filename))
{
string line = null; // Need to read to start with
while (true)
{
if (line == null)
{
line = reader.ReadLine();
// Check for end of file...
if (line == null)
{
break;
}
}
if (line.Contains("Magic category"))
{
string lastLine = line;
line = reader.ReadLine(); // Won't read again next iteration
}
else
{
// Process line as normal...
line = null; // Need to read again next time
}
}
}
答案 3 :(得分:0)
您可以在调用ReadLine之后保存流的位置,然后回到该位置。然而,这是非常低效的。
我会将ReadLine的结果存储到“缓冲区”中,并在可能的情况下将该缓冲区用作源。如果为空,请使用ReadLine。
答案 4 :(得分:0)
我不是真正的文件IO专家......但为什么不做这样的事情:
在开始阅读行之前,请声明两个变量。
string currentLine = string.Empty
string previousLine = string.Empty
然后在你读书的时候......
previousLine = currentLine;
currentLine = reader.ReadLine();