不能用这种格式解析CSV时间06:00:00;00
本文关键字:时间 CSV 格式 不能 | 更新日期: 2023-09-27 18:06:39
我有csv并每行读取,所以我可以将其保存在DB中。我使用filehelper通过逗号分隔符分隔每个,但忽略那些在"内部。抛出异常,因为数据是06:00:00;00。我不确定那是什么。怎么解析呢?这是时间跨度,但为什么在;后面有额外的00 ?对不起,数据只是给我的,没有解释它是用来做什么的。
这是来自文本文件的实际数据。
01/10/2013,06:00:00;00,06:09:40;08,00:09:40:09,01/10/2013,06:00:00;00,06:09:40;08,00:09:40:09,"January 9, 2013 - Dreams_01.mp4",Aired,7CFB84BD-A5B6-43E8-82EC-E78E7219B1C7
是否有一个转换器的filhelper ?我使用[FieldConverter(ConverterKind.Date, "dd/MM/yyyy")]
作为日期,但我不确定时间。
您可以提供自己的FieldConverter
,这使您能够添加您认为必要的任何逻辑。看起来你的数据不是很严格地结构化,所以你可能不得不玩一些,但这里有一个工作程序,它处理前几个字段:
[DelimitedRecord(",")]
public partial class MyClass
{
[FieldConverter(ConverterKind.Date, "dd/MM/yyyy")]
public DateTime Date;
[FieldConverter(typeof(MyTimeConverter))]
public DateTime Time1;
[FieldConverter(typeof(MyTimeConverter))]
public DateTime Time2;
[FieldConverter(typeof(MyTimeConverter))]
public DateTime Time3;
[FieldConverter(ConverterKind.Date, "dd/MM/yyyy")]
public DateTime Time4;
[FieldDelimiter("|")] // ignore the rest of the fields for this example
public string Optional3;
}
class Program
{
private static void Main(string[] args)
{
var engine = new FileHelperEngine<MyClass>();
var records = engine.ReadString(@"01/10/2013,06:00:00;00,06:09:40;08,00:09:40:09,01/10/2013,06:00:00;00,06:09:40;08,00:09:40:09,""January 9, 2013 - Dreams_01.mp4"",Aired,7CFB84BD-A5B6-43E8-82EC-E78E7219B1C7");
Assert.AreEqual(records[0].Date, new DateTime(2013, 10, 1));
Assert.AreEqual(records[0].Time1, DateTime.MinValue.Date.Add(new TimeSpan(0, 6, 0, 0)));
Assert.AreEqual(records[0].Time2, DateTime.MinValue.Date.Add(new TimeSpan(0, 6, 9, 40, 08)));
Assert.AreEqual(records[0].Time3, DateTime.MinValue.Date.Add(new TimeSpan(0, 0, 9, 40, 09)));
}
}
public class MyTimeConverter : ConverterBase
{
public override string FieldToString(object from)
{
return base.FieldToString(from);
}
public override object StringToField(string from)
{
/// apply any logic to clear up the input here
/// for instance, split the string at any ';' or ':'
var parts = from
.Split(';', ':')
.Select(x => Convert.ToInt32(x))
.ToList();
// if it has three parts assume there are no milliseconds
if (parts.Count == 3)
return DateTime.MinValue.Date.Add(new TimeSpan(0, parts[0], parts[1], parts[3]));
else if (parts.Count == 4) // if it has four parts include milliseconds
return DateTime.MinValue.Date.Add(new TimeSpan(0, parts[0], parts[1], parts[2], parts[3]));
throw new Exception("Unexpected format");
}
}
你可以看到我已经实现了一个MyTimeConverter
。(DateTime.MinValue.Date.Add(new TimeSpan())
是我所知道的最好的方法来创建一个DateTime
与一个空的日期部分。)