-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; }
    }

csvファイルに参加している他のフィールドと比較するために、surveyDateをとして読み取れるようにしたいと思います。DateTimeDateTime

surveyDateクラスでDate.Timeとして 設定しようとしましたが、selectステートメントで変換しようとしましたが、どちらも次のエラーで失敗します。

FormatException:文字列が有効なDateTimeとして認識されませんでした。インデックス0から始まる不明な単語があります。

csvファイルを使用する必要があるため、SQLサーバーにデータを追加できません。

contactID、responseDate、project、projectID
1,6 / 4 /2009,0-3ヶ月、
12,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

クラスで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それSurveyDateはそのDateTime時です:

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

正しい結果を確認するために、フォーマット文字列のフォームParseまたはフォーマット文字列を使用する必要がある場合があります。ParseExactそのフォーマット文字列は、ファイルで使用されているフォーマットによって異なります。

Parseまたは、 Customerで静的メソッドを作成することもできます。

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これがあなたがそれをする唯一の場所であるならば、それは不必要にがらくたでいっぱいになります。顧客の生産を開始する前にすべてを読むよりも、一度に1行ずつ取得する方がReadLines好きです。ReadAllLines

ちなみに、.NETの規則では、プロパティ名の大文字が優先されます。などSurveyDateではなくsurveyDate

于 2012-08-31T14:54:51.670 に答える
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;
    }
  }

次に、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

説明については、このリンクを参照してください

于 2012-08-31T15:23:19.453 に答える
-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 に答える