-6
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作为 a读取DateTime,以便将其与DateTime我加入 csv 文件的其他字段进行比较。

我尝试surveyDate在课堂上设置为 Date.Time,并尝试在 select 语句中对其进行转换,但都失败并出现以下错误:

FormatException:字符串未被识别为有效的 DateTime。从索引 0 开始有一个未知单词。

我必须使用 csv 文件,所以我无法将数据添加到 sql server。

contactID,responseDate,project,projectID
1,6/4/2009,0-3 月,1
2,6/11/2009,0-3 月,1

4

5 回答 5

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('"'))
于 2012-08-31T14:49:56.620 回答
0

对...因为您永远无法知道来自 CSV 的输入是什么,所以您不能总是尝试将字符串隐式转换为 DateTime,并且因为您想在选择一种方法中转换字符串是一种扩展方法。

  public static class StringExtensions
  {
    public static DateTime TryParseDate(this string strToParse)
    {
      DateTime dt = new DateTime();
      DateTime.TryParse(strToParse, out dt);
      return dt;
    }
  }

然后,当您要在选择中进行转换时,请执行以下操作:

  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

请参阅此链接以获取说明

于 2012-08-31T15:23:19.453 回答
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)

...但我们不知道是哪个,因为我们不知道“2009 年 6 月 4 日”是指 4 月 6 日还是 6 月 4 日。

于 2012-08-31T14:49:04.073 回答
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如果从这样的格式化字符串中获取 a 在您的代码中不止一次发生,这将具有优势。Customer如果这是您唯一这样做的地方,它会不必要地充满杂物。请注意,我更喜欢ReadLines一次ReadAllLines获得一条线,而不是在开始生产客户之前阅读整个内容。

顺便说一句,.NET 约定倾向于属性名称大写。SurveyDate而不是surveyDate

于 2012-08-31T14:54:51.670 回答
-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; }
    }
于 2012-08-31T14:48:42.563 回答