フィルタリングについて

以前にもここで質問させてもらった内容ですが、
A列(名前) B列(クラス) C列(時間)
田中太郎 Aクラス 0:00:10 ←h:mm:ss
山田二郎 Bクラス 0:01:00
佐藤三郎 Cクラス 0:00:05

というものがあったとして、データテーブルをフィルタリングで、時間が10秒以下ではない人を残したいと思っております。(このばあいは山田君が残る)

の問に
明示的にTimeSpanとして比較すればよいと思います。
式は例えば以下になります。
(EXCELから読み込んだDatatableをdt、C列の列名を"時間"とすると)

dt = dt.AsEnumerable.Where(function(r) TimeSpan.Parse(r("時間").toString)>(new TimeSpan(0,0,10))).CopyToDataTable()

,,,

とのご回答を頂きました。
しかしながら、実行すると、代入の部分で
数値要素の少なくとも1つが範囲外であるか、または桁数が多すぎるため、TimeSpanを解析できませんでした。とエラーが出てしまいます。
実際に読み込むデータテーブルの容量が大きいのですが、それが原因なのでしょうか?

こんにちは

元のデータに60以上の分、秒または24以上の時間の表記となっているデータが無いでしょうか?
例えば、00:70:23 のようなデータです。

TimeSpanはそれぞれ上記以上の値を持てないので、このようなデータがある場合は工夫が必要になります。
いくつか対応方法がありますが、一例を下記します。(時分秒表記の時のみ正しく動作します。)

dt.AsEnumerable.Where(function(r) r("時間").ToString.Split({":"c}).Select(function(x,i) CInt(x)*Math.Pow(60,2-i)).Sum(function(y) y)>10).CopyToDataTable()

Sample20200613-2v3.zip (26.1 KB)

想像ですが、Excelファイルから範囲を読み込みで読み込んでいるのではないでしょうか。

その場合、excelでは時刻のデータは数値となってしまっているので、uipathで読み込む際に「表示形式を維持」にチェックを入れると見た通りのデータとして入ります。

これでうまくいかないでしょうか。
※外していたらすいません。。

皆様、返信ありがとうございます。
データに関してですが、60分以上の分、秒、24以上の時間の表記は見当たりませんでした。
ですが、明日、もう一度よく確認したいと思います。

1 Like