我正在尝试解析CSV文件,并传递所需的字段。
然而,不管我似乎尝试什么,我都被告知'字符串未被识别为有效的DateTime'对于注册日期'字段。
我知道这是这个领域,因为当我把这个作为字符串设置时,并保持' DateOfBirth'作为DateTime,它运行得很好。
以下是字段类型和相关代码。
public string CustomerId { get; set; }
public string Forename { get; set; }
public string Surname { get; set; }
public DateTime? DateOfBirth { get; set; }
public string VehicleId { get; set; }
public string RegistrationNumber { get; set; }
public string Manufacturer { get; set; }
public string Model { get; set; }
public string EngineSize { get; set; }
public DateTime? RegistrationDate { get; set; }
public string InteriorColour { get; set; }
public string HasHelmet { get; set; }
public string VehicleType { get; set; }
和
public static IEnumerable<CarData> CsvParser()
{
using (TextFieldParser parser = new TextFieldParser(csv_file_path))
{
parser.SetDelimiters(new string[] { "," });
parser.HasFieldsEnclosedInQuotes = false;
parser.ReadLine();
while (!parser.EndOfData)
{
string[] fields = parser.ReadFields();
yield return new CarData()
{
CustomerId = fields[0],
Forename = fields[1],
Surname = fields[2],
DateOfBirth = DateTime.Parse(fields[3]),
VehicleId = fields[4],
RegistrationNumber = fields[5],
Manufacturer = fields[6],
Model = fields[7],
EngineSize = fields[8],
RegistrationDate = DateTime.ParseExact(fields[9], "yyyy-MM-dd", CultureInfo.InvariantCulture),
InteriorColour = fields[10],
HasHelmet = fields[11],
VehicleType = fields[12]
};
}
}
}
现在我一直在尝试.ParseExact但它仍然抛出错误..任何想法?
编辑:我要解析的字符串示例是&#39; 2007-02-28&#39;
关于潜在的重复问题,我相信我已经在上面的代码中尝试过该解决方案。
答案 0 :(得分:0)
在尝试解析之前,检查字段是否为空值或空值。
更改构造函数的这一行:
RegistrationDate = DateTime.ParseExact(fields[9], "yyyy-MM-dd", CultureInfo.InvariantCulture),
对此:
RegistrationDate = string.IsNullOrWhiteSpace(fields[9]) ? null : DateTime.ParseExact(fields[9].Trim(), "yyyy-MM-dd", CultureInfo.InvariantCulture),
确保RegistrationDate
字段的后续逻辑帐户可能为null
。
答案 1 :(得分:0)
您正在解析CSV中的空值。
有时处理CSV文件时,您可能不会期望该值存在。
private DateTime ParseDateTimeField(string date)
{
//If our string is not null
if (!string.IsNullOrWhiteSpace(date))
return DateTime.ParseExact(date, "yyyy-MM-dd", CultureInfo.InvariantCulture);
else
//Do something like return a specific date or maybe today.
//return DateTime.Today;
}
在您的代码中:
RegistrationDate = ParseDateTimeField(fields[9]);
答案 2 :(得分:0)
Sven
的函数来处理应该保存有效日期/时间值的单元格中的任何可能的错误信息:
private DateTime? ParseDateTimeField(string date)
{
DateTime value;
if (!DateTime.TryParseExact(dateString, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out value))
return null;
return value;
}
这应该使您的代码更加健壮,因为它不会因为不仅仅是空单元格的无效值而崩溃。