我创建了一个应用程序,我正在使用链接标签选项从.csv文件中获取数据,我想按开始日期,开始时间和结束日期,结束时间获取数据
我只尝试使用一个日期,开始时间和结束时间,例如 24/6/2019 10:00:00 AM至23:00:00 PM
private Task<List<Tag>> SearchCSV()
{
return Task.Run<List<Tag>>(() => {
var t = new List<Tag>();
if (string.IsNullOrWhiteSpace(filePath) || !File.Exists(filePath))
return new List<Tag>();
using (FileStream fileStream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
fileStream.Seek(0, SeekOrigin.Begin);
using (StreamReader sr = new StreamReader(fileStream))
{
while (!sr.EndOfStream)
{
string[] row = Regex.Split(sr.ReadLine(), ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
if (!DateTime.TryParse(row[0] as string, out DateTime date))
continue;
DateTime.TryParse(row[1] as string, out DateTime time);
DateTime dateTime = date.Add(new TimeSpan(time.Hour, time.Minute, time.Second));
if (dateTime >= startDate && dateTime <= endDate) { }
// t.Add(new Tag(dateTime, decimal.TryParse(row[selectedTankIndex + 2], out decimal tagValue) ? tagValue : 0));
}
}
}
return t;
});
}
我希望获取数据的日期为24/6/2019 10:00:00 AM至7/8/2019 23:00:00 PM
答案 0 :(得分:0)
如果可以的话,我建议您使用TextFieldParser类。它在VB命名空间中,但仍可以从C#引用,它将消除可能存在的问题和难以阅读的正则表达式:
using Microsoft.VisualBasic.FileIO;
...
using (FileStream fileStream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (var sr = new TextFieldParser(fileStream))
{
while (!sr.EndOfData)
{
string[] row = sr.ReadFields();
if (!DateTime.TryParse(row[0] as string, out DateTime date))
continue;
DateTime.TryParse(row[1] , out DateTime time);
//etc
}
}
}
如果您的日期可以采用不同的格式,则可以使用TryParseExact,它可以采用几种不同的格式:
DateTime.TryParseExact(row[0], new []{"dd/mm/yyyy hh:mm:ss tt", "d/m/yyyy hh:mm:ss tt", "d/mm/yyyy hh:mm:ss tt", "dd/m/yyyy hh:mm:ss tt" }, CultureInfo.InvariantCulture,DateTimeStyles.None,out var result);