2017-10-19 1 views
-1

このコードでitem.date_timeは "2017-10-18T04:57:39.000Z"のように見えます。 item.date_timeの代わりにこれ(または他の同様の文字列)を置くとうまくいきます。しかし、item.date_timeがこのような文字列に等しいという事実にもかかわらず - 私はそれを使用するとSystem.FormatExceptionを呼び出します。 datetimeが文字列を認識できないのはなぜですか?

static void Main(string[] args) 
{ 
    eventList = new List<CsvFile>(); 
    StreamReader sr = new StreamReader("logs.csv"); 
    string data = sr.ReadLine(); 

    while (data != null) 
    { 
     string[] line = data.Split(','); 
     ReadString(line); 
     data = sr.ReadLine(); 
    } 
} 

class CsvFile 
{ 
    public String date_time; 
    public DateTime datetime; 
} 

static void ReadString(String[] str) 
    { 
     CsvFile item = new CsvFile(); 
     item.date_time = str[0]; 
     item.datetime = DateTime.ParseExact(item.date_time, "yyyy-MM-ddTHH:mm:ss.000Z", CultureInfo.InvariantCulture); 
     eventList.Add(item); 
    } 

私はdatetime型の問題についての質問と回答、今日の数十を経て、この奇妙なことを解決することができ、何も見つかりませんでした。私のコードの問題は何ですか?

+3

予想されるDateTime形式のパターンに合致しない値があることは明らかです。それが何であるか把握するためにデバッガを使います。たぶん空の行があるかスペースがあるかエンコーディングが違うか隠された文字があります....これを理解できる唯一の人はあなたです、失敗した場合は値にアクセスできます(あなたの質問に*を含めていないので*) – Igor

+0

文字列が同じであることは間違いありませんか? 'item.date_time'は引用符やエスケープ文字を持っていますか?両者をコンソールに表示します。 – Blorgbeard

+2

また、 'DateTime.TryParseExact'を使用し、falseを返す場合は、*その値だけをコンソールに出力してください。 –

答えて

2

STR [0]あなたの文字列が引用符で囲む(したがって\"インジケータ)を有する

"\"2017-10-18T04:57:39.000Z\""等しいです。

item.date_time = str[0].Trim('"'); 
    item.datetime = DateTime.ParseExact(item.date_time, "yyyy-MM-ddTHH:mm:ss.000Z", CultureInfo.InvariantCulture); 

あなたはあなたが(これはあなたがにしているレコードのように入力値が何であるか、など)を、より良いエラーメッセージを解析が成功したかどうかを決定して表示することができTryParseExactを使用して検討するかもしれない:構文解析の前に、これらのトリム例外をスローするのではなく、

もう1つの方法は、値の引用符と日付/時刻解析の両方を処理できるCSV解析ライブラリを使用することです。

+0

ありがとう、@D Stanley、それは私にとって完璧です。 私はコーディングにおいて全く新しい初心者です。もちろん、それは賢明な質問ではありません。とにかく、私はあなた、特にあなたを癒したすべての人に感謝しています。 –

+0

@twin_choke質問するのを恐れないでください - みんなどこかで始まります。 –

関連する問題