Christiaan van Bergen
Привет,
Давным - давно я писал: Преобразование-текстовых-файлов-CSV-в-DataTable Не многие из нас все еще используют их больше, но время от времени я нахожу случаи, когда они все еще были бы применимы. Вы можете использовать приведенный ниже код в качестве консольного приложения и использовать его в своих файлах журналов. Используемое регулярное выражение адаптировано к вашему образцу, и выход таков, как вам, вероятно, нужно.
ХТ христиан
using System;
using System.Linq;
using System.Data;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections.Generic;
/// <summary>
/// Example of using the TextFileDataSet to read the contents of a log file
/// and aggregate some values.
/// You can get the TextFileDataSet at https://github.com/cvanbergen/TextFileDataSet
/// and read more about it at https://www.codeproject.com/Articles/22400/Converting-text-files-CSV-to-DataTable
/// </summary>
class Program
{
static void Main(string[] args)
{
// Create an instance of MyTextFileDataSet
// You can get the TextFileDataSet at https://github.com/cvanbergen/TextFileDataSet
var MyTextFileDataSet = new TextFileDataSet.TextFileDataSet();
// open the file, in this case I assume that the name is Logfile.txt and it is in the
// same folder as where this executes
using (var fileStream = new FileStream("Logfile.txt", FileMode.Open, FileAccess.Read))
{
// specify the regular expression for validating and recognising columns
// this expression is already tailored for your log file sample
MyTextFileDataSet.ContentExpression = new Regex(@"^(?<date>[^ ]+).+INFO \[1\] Luhn_Check.ResultForm.btnexport_Click -(?<name>[^:]+): generated (?<transactions>[0-9]+) transactions.$", RegexOptions.Multiline);
// fill the dataset
MyTextFileDataSet.Fill(fileStream);
}
// Create a collection of LogItems that we can later on show
var logItems = new List<LogItem>();
// Get all the rows from the first table in the dataset
var rows = MyTextFileDataSet.Tables[0].AsEnumerable();
// Iterate over all the rows and create a LogItem entry or
// update the 'Transactions' amount
foreach (var row in rows)
{
var date = DateTime.Parse(row.Field<string>("date"));
var name = row.Field<string>("name").Trim();
var transactions = int.Parse(row.Field<string>("transactions"));
var logItem = logItems
.Where(n => n.Date == date)
.Where(n => n.Name == name)
.FirstOrDefault();
if (logItem == null)
{
logItems.Add(new LogItem
{
Date = date,
Name = name,
Transactions = transactions
});
}
else
{
logItem.Transactions += transactions;
}
}
// Now output your LogItems.
// Hey, it is a collection, you can sort it any way you like
logItems
.OrderBy(n => n.Date)
.ThenBy(n => n.Name)
.ToList()
.ForEach(n =>
Console.WriteLine($"{n.Date} {n.Name} {n.Transactions}"));
// Just keep the console window open ;-)
Console.Read();
}
}
/// <summary>
/// A simple class for your LogItem
/// </summary>
class LogItem
{
public DateTime Date { get; set; }
public string Name { get; set; }
public int Transactions { get; set; }
}