日付型を並べ替えられない

CSVで日付の列があるのですが、
それを加工したいです。

できれば、最新順に並べたり、後は該当の日だけ取ってくるようにしたいです。

やり方を教えてください!

Hi @hiroya

Check this

Thanks
Ashwin S

@hiroya

Check below example :point_down:

SortDate.zip (19.4 KB)

Let me know if it works for you :slight_smile:

1 Like

thanks, but it doesn’t work for me.
Maybe because I use CSV and the format is string format.

Could you please try this out??

Test.zip (18.4 KB)

1 Like

@hiroya

Ok, on two parts :

Read CSV :

1 - Get data from CSV
2 - Split it and take only the date
3 - Change it to Date format
4 - Save as a date format

Save CSV :

1 - Build Data Table
2 - Add rows from your array
3 - Save to CSV

Below xaml file :point_down:

SortDate.zip (14.6 KB)

Let me know if it works for you :slight_smile:

こんにちは

例えば「日付」という列に2020/03/04のような形式でデータがある場合、以下の式で降順ソートできます。(ソースがCSVからでも問題なく処理できると思います。)

dt = dt.AsEnumerable.OrderByDescending(function(r) DateTime.ParseExact(r("日付").toString,"yyyy/MM/dd",nothing)).CopyToDataTable()

日付の形式が異なる場合はParseExactメソッドの中の書式"yyyy/MM/dd"を変更する必要があります。

In Japanese, Sorry about that.

ありがとうございます。CSVデータ(String型)からdd/MM/yyyyに変更し、
出力する方法について理解しました。

しかし、今やりたいことは、CSVデータを日付型に変更し、
それをソート(Decending)した状態で出力したいです。

何度も何度も申し訳ございません。

1 Like

@hiroya

Sure, below file :slight_smile:

SortDate.zip (14.6 KB)

1 Like

ありがとうございます!試してみました。
2020/03/04ではなく、03/04/2020のような形になっている場合は、うまくいかないですよね?
もし可能であれば、形式を変更するやり方を教えてほしいです。

1 Like

こんにちは

CSVファイル中のデータが03/04/2020の形式になっているのであれば、先ほどの式中の"yyyy/MM/dd"の部分を"MM/dd/yyyy"とすれば処理可能です。

こんにちは。ありがとうございます。
できました。もしほかに質問ありましたら、させてください!
ありがとうございました!

1 Like

こんにちは。すいません、もう一点質問させてください。
日付の列で、03/04/2020のような形ではないものが入ってしまっている場合、
エラーを吐きます。(例えば、空欄など)
そういったものを回避して、整列させる方法はございませんでしょうか。

こんにちは

正規表現でMM/dd/yyyy形式のもののみをフィルタする条件を追加してみましたので、お試しください。なお値としてNullが入っている場合は、別にこれを配慮する条件を追加する必要があります。

dt.AsEnumerable.Where(function(r) System.Text.RegularExpressions.Regex.IsMatch(r("日付").toString(),"^\d{2}/\d{2}/\d{4}$" )).OrderByDescending(function(r) DateTime.ParseExact(r("日付").toString,"MM/dd/yyyy",nothing)).CopyToDataTable()

こんにちは。

ありがとうございます。

またあした試してみます。

ちなみにselect関数で条件をしていて、datatableをフィルタリングするとき、

条件に引っかからない場合はエラーを吐きますが、吐かない方法とかないんですかね??

あとdatatableの任意の行に、空白行を挿入する方法とかってありませんかね??

すいませんいろいろ質問してしまいました。

こんにちは

ちなみにselect関数で条件をしていて、datatableをフィルタリングするとき、
条件に引っかからない場合はエラーを吐きますが、吐かない方法とかないんですかね??

単にフィルタリングするだけではエラーにならないはずです。CopyToDataTableメソッドを使用している場合は、対象が空の場合、ここでエラーになります。そのため、CopyToDataTable()する前の出力の行数を数えて、1以上ならCopyToDataTable()を、0なら何もしないようにすればエラーにはなりません。

あとdatatableの任意の行に、空白行を挿入する方法とかってありませんかね??

それ専用のアクティビティはないのでInvoke MethodアクティビティでDataRowCollection.InsertAtメソッドを使用する必要があります。

こんにちは

いつもありがとうございます。

試してみます。

Just ideaなのですが、空のdatatbleを用意しておいて、append rangeでそれを追加するってできますかね?

あとで(datatable型変数).NeWRowで変数を定義し、それをデータ行を追加アクティビティから入れることってできそうですかね??

あとごめんなさい、最後に1点、select関数で複数条件(OR条件)で記載したいのですが、サンプルフォーマットをいただけませんかー??

こんにちは

一度ご自身で試してみると良いと思いますよ。

こんにちは。
やってみたのですが、もし文字列が空白が入っている場合はエラーを吐いてしまいます。
除外する方法をご教示いただけないでしょうか。

こんにちは

文字列が空白が入っている場合はエラー

具体的な内容が無いので推測になりますが、日付文字列中に不要な空白が入っているということでしょうか?

そうであれば、 上記の

DateTime.ParseExact(r("日付").toString,"MM/dd/yyyy",nothing)

DateTime.ParseExact(r("日付").toString.Trim,"MM/dd/yyyy",nothing)

(前後に余分な空白がある場合)

あるいは

DateTime.ParseExact(r("日付").toString.Replace(" ",""),"MM/dd/yyyy",nothing)

(空白を空文字列に置換)

のようにして空白を除去してあげると良いと思います。

ご回答ありがとうございます。

通常はMM/do/yyyyのような形ではいるのですが、

例外としてなにも入らない(空白)の場合があり、

そこでエラーを吐いてしまいます。