5

こんにちは、ファイルから日付を読み取る次のコードがあります。

using (var reader = new StreamReader(@"C:\myfile.txt")) 
{
    bool found= false;
    while (!reader.EndOfStream) 
  {
        var line = reader.ReadLine().Trim();

        if (found && line.EndsWith("Test")) 
        {
            var fordDate = DateTime.Parse(line.Substring(0, 19));
            Console.WriteLine("Test Date: {0}", fordDate);
            break;
        }
   }
 }

問題は、日付に他のテキストが関連付けられている場合にエラーが発生することです。例えば

\r\n2013-03-03 12:22:02 

コードが「\r\n」またはその他のテキストを削除して日付部分だけを取得できるように変更しようとしています。

4

3 に答える 3

3

正規表現を使用する必要があります

日付が常に同じ形式である場合は、個々の行から日付を抽出し、両側のその他のものをすべて削除する正規表現を簡単に記述できます。正規表現を理解するには、次のようになります。

\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}

この正規表現は単純化されすぎており、そのような日付0000-00-00 99:99:99は無効である可能性があります。ファイルが日付として表示される可能性があるが、表示されない値を保持できるかどうかによって異なります。YYYY-MM-DDより複雑な(しかしより有効な)式は次のようになります(日付がそうではないと仮定YYYY-DD-MM):

[12]\d{3}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])\s(?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)

これにより、1000年から2999年までの日付、01から12までの正しい月番号、01から31までの日、00:00:00から23:59:59までの時間が許可されます。

ただし、この正規表現をより便利にするために、括弧で囲んで名前を付け、これらの日付がdateコード内の名前付きキャプチャグループ()の一部になり、インデックスではなく名前を使用してアクセスできるようにします。

Regex rx = "(?<date>[12]\d{3}-(?:0\d|1[0-2])-(?:0[1-9]|[12]\d|3[01])\s(?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)).*Test$";
if (rx.Text(line))
{
    Match m = rx.Match(line);
    // no need to use TryParse as regex assures correct formatting
    fordDate = DateTime.Parse(m.Groups["date"]);
}

したがって、その行がで終わることを手動でチェックする代わりにTest、正規表現に同じ要件を含めました。

于 2013-03-07T07:19:42.913 に答える
1

このコードを使用して、必要な記号を置き換えます。

string lineAfterReplace = line.Replace("\t", "").Replace("\r", "").Replace("\n", "");

@J。Davidson- MSDNリンクを使用する方が良い場合もありますTryParse

あなたがこのコードのある種を持っているより:

if (DateTime.TryParse(dateString, out dateValue))
{
   /* it was parsed without errors */
}
于 2013-03-07T07:20:41.710 に答える
0

変化する:

var fordDate = DateTime.Parse(line.Substring(0, 19));

に:

var fordDate = DateTime.Parse(line.Substring(0, 19).Trim());

すべての DateTime 文字列がファイルの 1 行に単独である場合は、次を使用することをお勧めします。

var fordDate = DateTime.Parse(line.Trim());
于 2013-03-07T07:26:54.833 に答える