我如何计算日志文件中的行并为其创建新的日志文件?
下面是我的日志文件:
DDD.CGLOG
ID|AFP|DATE|FOLDER
1|DDD|20181204|B
2|DDD|20181104|B
3|DDD|20181004|B
FFF.CGLOG
ID|AFP|DATE|FOLDER
1|FFF|20181204|B
2|FFF|20181104|B
WWW.CGLOG
ID|AFP|DATE|FOLDER
1|WWW|20181204|B
我要计算行数并创建一个新的日志文件,如下所示:
DDD_QTY.Log
AFP|QTY
DDD|3
EEE_QTY.Log
AFP|QTY
EEE|2
WWW_QTY.Log
AFP|QTY
WWW|1
以下是我尝试过的内容。我已经设法从文件夹内的每个日志文件中获取计数,现在我只需要使用与现有日志文件同名的方式将计数写入新的日志文件中即可。
string[] ori_Files = Directory.GetFiles(@"F:\Work\FLP Code\test", "*.CGLOG*", SearchOption.TopDirectoryOnly);
foreach (var file in ori_Files)
{
using (StreamReader file1 = new StreamReader(file))
{
string line;
int count = 0;
while ((line = file1.ReadLine()) != null)
{
Console.WriteLine(line);
count++;
}
Console.WriteLine(count);
}
}
Console.ReadLine();
答案 0 :(得分:2)
由于您只想计算行数,因此可以保持简单。假设文件名决定了AFP值
static long CountLinesInFile(string fileName,string outputfile)
{
var afp = Path.GetFileNameWithoutExtension(fileName);
var lineCount = File.ReadAllLines(fileName).Length;
File.WriteAllText(outputfile,$"AFP|QTY{Environment.NewLine}{afp}|{lineCount -1}");
return lineCount-1;
}
请注意,您减少的行数(示例中不包括标题)。如果文件与AFP术语不同,则可以使用正则表达式从每个术语中标题行以外的任何行中解析AFP术语。用于解析AFP条款的正则表达式示例
new Regex(@"^[0-9]+\|(?<AFP>[a-zA-Z]+)\|[0-9]+\|[a-zA-Z]+$")
更新
如果您的文件很大(例如15-20Gb-考虑到它是一个日志文件),则更好的方法是
static long CountLinesInFile(string fileName,string outputFileName)
{
var afp = Path.GetFileNameWithoutExtension(fileName);
uint count = 0;
int query = (int)Convert.ToByte('\n');
using (var stream = File.OpenRead(fileName))
{
int current;
do
{
current = stream.ReadByte();
if (current == query)
{
count++;
continue;
}
} while (current!= -1);
}
using (System.IO.StreamWriter file = new System.IO.StreamWriter(outputFileName, true))
{
file.WriteLine($"AFP|QTY{Environment.NewLine}{afp}|{count}");
}
return count;
}
更新2
要为给定文件夹中的所有文件调用该方法,可以使用DirectoryInfo.GetFiles,例如
DirectoryInfo d = new DirectoryInfo(@"E:\TestFolder");
FileInfo[] Files = d.GetFiles("*.txt");
foreach(FileInfo file in Files )
{
CountLinesInFile(file.FullName,$"{file.FullName}.processed");
}
答案 1 :(得分:0)
一个简单的2班轮
static void CountLines(string path,sting outfile)
{
var count = File.ReadLines(path).Count();
File.WriteAllText(outfile, $"AFP|QTY{Environment.NewLine}DDD|{count}");
}