Вы могли бы (неуверенно) сойтись с чем-то вроде этого Pattern . Он учитывает отрицательное значение Расширенная запись , а также содержит вкладки в исходном формате (не показан в примере)
^""\d+/\d+/\d+ \d+:\d+:\d+ (AM|PM)""\s+-?\d+\s+\d+.?\d+e-\d+
* Примечание : я не собираюсь писать объяснение регулярному выражению, поскольку оно слишком длинное
Пример
var pattern = @"^""\d+/\d+/\d+ \d+:\d+:\d+ (AM|PM)""\s+-?\d+\s+\d+.?\d+e-\d+";
var regex = new Regex(pattern, RegexOptions.Compiled);
var filePaths = Directory.GetFiles(@"C:\Temp", "*.txt");
var results = new List<string>();
foreach (var file in filePaths)
{
var lines = File.ReadLines(@"D:\sample.txt").Where(x => regex.IsMatch(x));
results.AddRange(lines);
}
Однако, чтобы сделать этот шаг дальше, вы можете сделать следующее. Это поместит все данные, проанализированные в класс.
С учетом
public class ScanData
{
public DateTime Time { get; set; }
public int Scan { get; set; }
public decimal?[] MassResults { get; set; }
public static ScanData FromString(string data)
{
var split = data.Split('\t');
decimal? Local(string value)
{
return decimal.TryParse(value, NumberStyles.Float, null, out var output) ? output : (decimal?)null;
}
var scanData = new ScanData()
{
Time = DateTime.ParseExact(split[0].Trim('"'), "M/d/yyyy h:m:s tt", null),
Scan = int.Parse(split[1]),
MassResults = split.Skip(2).Select(Local).ToArray()
};
return scanData;
}
}
* * Пример тысячи двадцать-шести * 1 028 *
var pattern = @"^""\d+/\d+/\d+ \d+:\d+:\d+ (AM|PM)""\s+-?\d+\s+\d+.?\d+e-\d+";
var regex = new Regex(pattern, RegexOptions.Compiled);
var filePaths = Directory.GetFiles(@"C:\Temp", "*.txt");
var results = new List<ScanData>();
foreach (var file in filePaths)
{
var lines = File.ReadLines(@"D:\sample.txt")
.Where(x => regex.IsMatch(x))
.Select(x => ScanData.FromString(x));
results.AddRange(lines);
}