0

CSVファイルを取得してデータベースに更新する小さなプログラムを作成しています。ファイルの1つにdate-of-birth列があり、列が常に同じ形式であるとは限りません。

単一の日付があいまいになる可能性があるため、リスト全体をチェックして形式を決定するコードを書き始めました(例:「10/12/12」、「10/12/2012」、「12/10/2012」、「2012」 / 12/10'はすべて同じ日付にすることができます)。私は、フォーマットが与えられたリストに対して一貫していると仮定しています。

これは私がこれまでに持っているコードです、

private static string GetDateFormat(string[] date)
{
    DateTime result;
    CultureInfo ci = CultureInfo.InvariantCulture;
    string[] fmts = ci.DateTimeFormat.GetAllDateTimePatterns();
    bool error;
    date = date.Where(x => !string.IsNullOrEmpty(x)).ToArray();
    foreach (string a in fmts)
    {
        error = false;
        for (int i = 0; i < date.Count(); i++)
        {
            if (!DateTime.TryParseExact(date[i], a, ci, DateTimeStyles.AssumeLocal, out result))
            {
                error = true;
            }

        }
        if (error == false)
        {
            return a;
        }            
    }
    throw new CsvToImsException("Error: Date Format is inconsistant or unrecognised");
}

しかし、各リストの小さな問題のために、私が持っているサンプルの日付のいずれかでそれを動作させることができません(1つのリスト'4/5/2012'の代わりに日付が設定されて'04/05/2012'いる、別のリストには日付が設定されている'4/05/2012 0:00'など)。

これは一般的な問題であるに違いありません。このアプリケーションに十分な広さのライブラリを作成した人はいますか?解析のために日付を文字で分割することを検討しています'/'が、もっと簡単な方法はありますか?

4

2 に答える 2

1

これは、必要なものに正しい軌道に乗ることができるものです。日付が単一の月の値と単一の日の値である場合、2 つの条件付き if ステートメントを追加するだけでよいため、コード例のコメントを読んでください。

//of course you will not hard code the dates you will replace DateString with your 
//Date Variable you can also convert the code below into a method if you so 
string DateString = "04/05/2012";
var dateLength = DateString.Length;
IFormatProvider culture = new CultureInfo("en-US", true);
DateTime dateVal;
switch (dateLength)
{
     case 8:
        {
          dateVal = DateTime.ParseExact(DateString, "M/d/yyyy", culture);
            break;
        }
    case 9:
        {
            // he you can add your own additional if(){} condition to check if date value Day has a length of 2 
            // if so then you know that the date is in m/dd/yyyy format
            // otherwise you know it's in mm/d/yyyy but 
            dateVal = DateTime.ParseExact(DateString, "M/dd/yyyy", culture);
            break;
        }
    case 10:
        {
            dateVal = DateTime.ParseExact(DateString, "MM/dd/yyyy", culture);
            break;
        }

}
于 2013-01-30T00:49:58.473 に答える
0

DJ KRAZEのコードからいくつかの追加を加えて、元の方法と同様の方法を使用することになりました。これは、 のような非常に奇妙なものを除くすべてで機能しますが、4/05/2012 0:00の行に沿って特別なケースを追加することで修正できますfmts.Add("d/MM/yyyy h:mm")

//Parse DOB to check format
string[] dateList = new string[PersonList.Count()];
for (int i = 0; i < PersonList.Count(); i++)
{
    PersonList[i].DOB = PersonList[i].DOB.Replace('-', '/').Replace('.', '/').Trim();
    dateList[i] = PersonList[i].DOB;
}
string dateFormat = GetDateFormat(dateList);


private static string GetDateFormat(string[] date)
{
    DateTime result;
    CultureInfo ci = CultureInfo.InvariantCulture;
    List<string> fmts = ci.DateTimeFormat.GetAllDateTimePatterns().ToList();
    fmts.Add("yyyy/MM/d");
    fmts.Add("d/MM/yyyy");
    bool error;
    date = date.Where(x => !string.IsNullOrEmpty(x)).ToArray();
    foreach (string a in fmts)
    {
        error = false;
        for (int i = 0; i < date.Count(); i++)
        {
            if (!DateTime.TryParseExact(date[i], a, ci, DateTimeStyles.AssumeLocal, out result))
            {
                error = true;
            }
        }
        if (error == false)
        {
            return a;
        }          
    }
    throw new CsvToImsException("Error: Date Format is inconsistant or unrecognised");
}

次に、for ループで日付形式を使用して、リスト内のすべての日付を解析できます。

IFormatProvider culture = new CultureInfo("en-US", true);
BirthDate birthDate = DateTime.ParseExact(person.DOB, dateFormat, culture);
于 2013-01-30T05:52:36.157 に答える