var csv =
from line in File.ReadAllLines("C:/file.csv")
let customerRecord = line.Split(',')
select new Customer()
{
contactID = customerRecord[0],
surveyDate = customerRecord[1],
project = customerRecord[2],
projectCode = customerRecord[3]
};
public class Customer
{
public string contactID { get; set; }
public string surveyDate { get; set; }
public string project { get; set; }
public string projectCode { get; set; }
}
我希望能够将surveyDate
读作DateTime
,以便将其与我加入csv文件的其他DateTime
字段进行比较。
我尝试在类中设置surveyDate
作为Date.Time,我尝试在select语句中转换它,但两者都失败并出现以下错误:
FormatException:字符串未被识别为有效的DateTime。从索引0开始有一个未知单词。
我必须使用csv文件,因此无法将数据添加到sql server。
的ContactID,responseDate,项目,专案编号
1,6 / 4 / 2009,0-3个月,1 2,6 / 11 / 2009,0-3个月,1
答案 0 :(得分:1)
您需要在阅读时解析它以及更改类型。我不确定你是如何尝试它的。另外,如果您知道格式,请使用DateTime.ParseExact
。
var csv =
from line in File.ReadAllLines("C:/file.csv")
let customerRecord = line.Split(',')
select new Customer()
{
contactID = customerRecord[0],
surveyDate = DateTime.Parse(customerRecord[1]),
project = customerRecord[2],
projectCode = customerRecord[3]
};
public class Customer
{
public string contactID { get; set; }
public DateTime surveyDate { get; set; }
public string project { get; set; }
public string projectCode { get; set; }
}
根据您刚发布的错误判断,我认为它可能是双引号。尝试修剪报价:
DateTime.Parse(customerRecord[1].Trim('"'))
答案 1 :(得分:0)
我试过在课堂上将surveyDate设置为Date.Time,我尝试在select语句中将其转换,但都失败了。
你需要做两件事。您需要更改属性类型(理想情况下同时修复命名以遵循约定)和更改您设置的位置,可能使用DateTime.ParseExact
,指定格式,可能还需要不变的文化。
(我假设你知道文件中日期的格式 - 我会强烈建议你使用DateTime.ParseExact
而不是让框架尝试各种格式,直到它找到一个有效的。)
DateTime.ParseExact(text, "d/M/yyyy", CultureInfo.InvariantCulture)
或:
DateTime.ParseExact(text, "M/d/yyyy", CultureInfo.InvariantCulture)
...但我们无法分辨哪一个,因为我们不知道“6/4/2009”是指4月6日还是6月4日。
答案 2 :(得分:0)
更改Customer
后,SurveyDate
为DateTime
,然后:
select new Customer()
{
contactID = customerRecord[0],
surveyDate = DateTime.Parse(customerRecord[1]),
project = customerRecord[2],
projectCode = customerRecord[3]
};
您可能需要使用采用格式字符串的Parse
或ParseExact
形式,以确保正确的结果。该格式字符串取决于文件中使用的格式。
或者,您可以在Customer上创建Parse
静态方法:
public class Customer
{
public string contactID { get; set; }
public DateTime surveyDate { get; set; }
public string project { get; set; }
public string projectCode { get; set; }
public static Customer Parse(string line)
{
var parts = line.Split(',');
return new Customer{
contactID = parts[0],
surveyDate = DateTime.Parse(customerRecord[1]),
project = customerRecord[2],
projectCode = customerRecord[3]
};
};
然后:
var csv =
from line in File.ReadLines("C:/file.csv")
select Customer.Parse(line);
如果在代码中从这样的格式化字符串中获取Customer
不止一次,则这有一个优势。如果这是你唯一的地方,它会毫无疑问地填充Customer
。注意我赞成ReadLines
超过ReadAllLines
一次获取一行,而不是在开始生产客户之前阅读整个内容。
顺便提一下,.NET约定支持属性名称上的大写字母。 SurveyDate
而不是surveyDate
等。
答案 3 :(得分:0)
正确...因为你永远无法知道CSV的输入是什么,所以你不能总是尝试将字符串隐式转换为DateTime,因为你想在select中选择一个字符串的转换方式这样做是一种扩展方法。
public static class StringExtensions
{
public static DateTime TryParseDate(this string strToParse)
{
DateTime dt = new DateTime();
DateTime.TryParse(strToParse, out dt);
return dt;
}
}
然后当你想在select中进行转换时这样做:
var csv = from line in File.ReadAllLines("C:/file.csv")
let customerRecord = line.Split(',')
select new Customer()
{
contactID = customerRecord[0],
surveyDate = customerRecord[1].TryParseDate(),
project = customerRecord[2],
projectCode = customerRecord[3]
};
你有自己的方法。希望这对您有所帮助。
您要解析的字符串将传递给该方法,然后您可以处理它并返回有效的日期时间,处理不正确的输入。
http://msdn.microsoft.com/en-us/library/bb383977.aspx
请参阅此链接以获取解释
答案 4 :(得分:-1)
您应该将customerRecord[1]
字符串转换为DateTime
。
var csv =
from line in File.ReadAllLines("C:/file.csv")
let customerRecord = line.Split(',')
select new Customer()
{
contactID = customerRecord[0],
surveyDate = DateTime.Parse(customerRecord[1]),
project = customerRecord[2],
projectCode = customerRecord[3]
};
public class Customer
{
public string contactID { get; set; }
public DateTime surveyDate { get; set; }
public string project { get; set; }
public string projectCode { get; set; }
}