从CSV设置变量类型

时间:2012-08-31 14:46:19

标签: c# linq

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

5 个答案:

答案 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后,SurveyDateDateTime,然后:

select new Customer()
    {
        contactID = customerRecord[0],
        surveyDate = DateTime.Parse(customerRecord[1]),
        project = customerRecord[2],
        projectCode = customerRecord[3]
    };

您可能需要使用采用格式字符串的ParseParseExact形式,以确保正确的结果。该格式字符串取决于文件中使用的格式。

或者,您可以在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; }
    }