Я бы не использовать регулярное выражение (или String.split) для этого, но цикл, где вы синтаксический анализ каждой строки. Я бы также использовал специальный класс для сопоставления с таблицей базы данных, чтобы увеличить повторяемость и повторное использование.
Класс (упрощенный):
public class Data
{
public string Token1 { get; set; } // use a meaningful name
public string Token2 { get; set; } // use a meaningful name
public DateTime Date { get; set; } // use a meaningful name
public override string ToString()
{
return string.Format("Token1:[{0}] Date:[{1}] Token2:[{2}]",
Token1,
Date.ToString("MM/dd/yy HH:mm:ss", CultureInfo.InvariantCulture),
Token2);
}
}
Ваша строка образца:
string data = @"rta_geo5: 09/24/14 15:10:38 - Reset_count = 6
rta_geo5: 09/24/14 15:10:38 - restarting
rta_geo5: 09/24/14 15:10:38 - memory allocation: 3500 lines";
Теперь вы можете использовать этот цикл с помощью простых строковых методов для анализа текста на List<Data>
:
string[] lines = data.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
List<Data> allData = new List<Data>();
foreach (string line in lines)
{
string token1 = null, token2 = null;
DateTime dt;
int firstColonIndex = line.IndexOf(": ");
if (firstColonIndex >= 0)
{
token1 = line.Remove(firstColonIndex);
firstColonIndex += 2; // start next search after first token to find DateTime
int indexOfMinus = line.IndexOf(" - ", firstColonIndex);
if (indexOfMinus >= 0)
{
string datePart = line.Substring(firstColonIndex, indexOfMinus - firstColonIndex);
if (DateTime.TryParseExact(datePart, "MM/dd/yy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
{
indexOfMinus += 3; // start next search after DateTime to get last token
token2 = line.Substring(indexOfMinus);
Data d = new Data { Token1 = token1, Token2 = token2, Date = dt };
allData.Add(d);
}
}
}
}
Испытание:
foreach (Data d in allData)
Console.WriteLine(d.ToString());
Token1:[rta_geo5] Date:[09/24/14 15:10:38] Token2:[Reset_count = 6]
Token1:[rta_geo5] Date:[09/24/14 15:10:38] Token2:[restarting]
Token1:[rta_geo5] Date:[09/24/14 15:10:38] Token2:[memory allocation: 3500 lines]
Этот подход более подробный, но более эффективный/ремонтопригодный, чем другие. Он также позволяет регистрировать аномалии или использовать другие методы для его анализа.
Вы пытались самостоятельно построить образец? Как прошло? – Utkanos
Как вы хотите различать 'rta_geo5:' и 'alloc:'? Каковы строгие правила, которые вы хотите использовать для разделения? –
Похоже, это может быть фиксированная ширина. Если так, я лично просто вытащу нужные подстроки. – juharr