0

Excel ファイルからデータをインポートしていますが、インポートしているデータが TimeSpan か通常の文字列かを確認する必要があります。データは07:00:00またはD2 07:00のいずれかになるためです。Excel ファイルでは、一部のフィールドはtt:mmにフォーマットされていますが、その他はプレーン テキスト フィールドです。

私のコードは次のようになります。

 public void ReadExcelFile()
        {
            string filename = @"C:\Temp\Copy2.xlsx";
            using (OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""))
            {
                try
                {
                    connection.Open();
                    string sqlCmd1 = "SELECT  * FROM [Sheet1$]";
                    using (OleDbCommand command = new OleDbCommand(sqlCmd1, connection))
                    {
                        command.CommandType = System.Data.CommandType.Text;
                        using (OleDbDataReader reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                alias = "" + reader[3];
                                codeT = "" + reader[4];
                                dtTruck = "" + reader[5];
                                codeP = "" + reader[6];
                                dtPlane = "" + reader[7];
                                dtDealer = "" + reader[8];

                                TimeSpan ts;
                                bool TruckisValid = TimeSpan.TryParse(dtTruck, CultureInfo.InvariantCulture, out ts);
                                bool PlaneisValid = TimeSpan.TryParse(dtPlane, out ts);
                                if (TruckisValid )
                                {
                                    truck = TimeSpan.FromDays(Convert.ToDouble(dtTruck));
                                }
                                else if (PlaneisValid)
                                {
                                    plane = TimeSpan.FromDays(Convert.ToDouble(dtPlane));
                                }
                                else
                                {

                                }

                                if (dtTruck == "" && dtPlane == "")
                                {
                                    dtTruck = "";
                                    dtPlane = "";
                                }
                                else if (dtTruck != "")
                                {
                                    truck = TimeSpan.FromDays(Convert.ToDouble(dtTruck));
                                    dtPlane = "";
                                }
                                else if (dtPlane != "")
                                {
                                    plane = TimeSpan.FromDays(Convert.ToDouble(dtPlane));
                                    dtTruck = "";
                                }


                                SearchForAdrIDAndCustID(Convert.ToString(reader[0]), Convert.ToString(reader[3]));
                                InsertData(custID, "" + reader[3], adrID, truck, codeT, plane, codeP, dtDealer);
                            }
                        }
                    }

                }
                catch (Exception exception)
                {
                    Console.WriteLine("ERROR in ReadExcelFile() method. Error Message : " + exception.Message);
                }
            }
        }

ご覧のとおり、ブール値を使用して、インポートされたフィールドがタイムスパンかどうかを判断しようとしました。しかし、bool は常に false です。

誰でも助けることができますか?

4

2 に答える 2

2

質問の関連部分は次のとおりです。

TimeSpan ts;
bool TruckisValid = TimeSpan.TryParse(dtTruck, CultureInfo.InvariantCulture, out ts);
bool PlaneisValid = TimeSpan.TryParse(dtPlane, out ts);
if (TruckisValid )
{
    truck = TimeSpan.FromDays(Convert.ToDouble(dtTruck));
}
else if (PlaneisValid)
{
    plane = TimeSpan.FromDays(Convert.ToDouble(dtPlane));
}
else
{

}
  1. 2 つの異なるフィールドに同じTimeSpan変数を再利用しています。ts解析できるかどうかをテストするためだけに使用すると仮定します。代わりに、parsed を使用する必要がありますTimeSpan
  2. をテストしてTimeSpanますが、に変換していますdouble。TimeSpan に変換できるか、または両方ではなく double に変換できます。

したがって、このアプローチの方が優れている可能性があります。

double d;
TimeSpan ts;
bool TruckisValidDouble = false;
bool TruckisValidTimeSpan = TimeSpan.TryParse(dtTruck, CultureInfo.InvariantCulture, out ts);
if(!TruckisValidTimeSpan)
{
    TruckisValidDouble = double.TryParse(dtTruck, out d);
}
// use approapriate variables

コメントから:

それを double に変換する理由は、Excel ファイルからデータをインポートすると、07:00:00 のパーセンテージ値が 0,29166666667 になるためです。そのため、double 値をタイムスパンに変換しています。

TimeSpanただし、チェックして解析することはできませんdoubleTimeSpanビアであることがわかっている場合は、変数を直接TryParse使用してください。TimeSpanそれ以外の場合double.TryParseは、後でその変数を使用します。

例えば:

if(!TruckisValidTimeSpan  && TruckisValidDouble)
{
    ts = TimeSpan.FromHours(d * 24);
}
于 2012-11-20T09:35:21.060 に答える
0

You could use a regex to check if your value is a TimeSpan like so:

Regex reg = new Regex("^\d{2}:\d{2}:\d{2}$"); 
bool TruckIsValid = reg.IsMatch(dtTruck);
于 2012-11-20T09:34:47.693 に答える