データテーブルを指定列で分割する方法

データテーブルを指定列で分割する方法が分かりません。

添付画像例に実現したい内容をご説明すると、
・手当1~手当5
・控除1~控除5
・時間外手当~特別手当
の3つの列にデータテーブルを3分割したいのですがどのようにすればよろしいでしょうか?

実際のデータテーブルは膨大な列数のため、
dt従業員 = dt従業員.DefaultView.ToTable(False,“手当1”,“手当2”・・)のような形で抜き出すのは難しいため、ここからここまでの列を抜き出すという操作ができればと考えています。

お詳しい方ご教授いただければ幸いです。
よろしくお願いいたします。

基本的にはこのアプローチベースで良いかと思います。

arrColumns1 = dt.Columns.Cast(Of DataColumn).Select(Function(dc) dc.ColumnName).Where(Function(s) System.Text.RegularExpressions.Regex.IsMatch(s,"^手当")).ToArray

として

dt.DefaultView.ToTable(False,arrColumns1)

とすれば、列名が「手当」で始まる列だけを抽出できます。

控除から始まる場合は

dt.Columns.Cast(Of DataColumn).Select(Function(dc) dc.ColumnName).Where(Function(s) System.Text.RegularExpressions.Regex.IsMatch(s,"^控除")).ToArray

手当で終わる場合は

dt.Columns.Cast(Of DataColumn).Select(Function(dc) dc.ColumnName).Where(Function(s) System.Text.RegularExpressions.Regex.IsMatch(s,"手当$")).ToArray

になります

単純にフィルトデータテーブルで抜き出せばよいのでわ?

1 Like

koretaさん

ご返信ありがとうございます。
フィルタで抜き出しも検討したのですが、列の項目数が多いこと、列の項目が増減することが頻繁にあることから難しいと判断しました。
細かく背景や条件など述べず質問してしまい申し訳ございません。

Yoichiさん

返信ありがとうございます。
サンプルで添付した画像だと分かりやすく手当1、手当2…としてますが、実際には具体的な手当や控除名が記載されており、正規表現を用いて「手当」「控除」といった 項目名で対象の列を抽出するのは困難です。
そのため「手当1~手当5」「控除1~控除5」「時間外手当~特別手当」といった形で指定して分割するか、
控除1と時間外手当のcolumn値を取得し、「column0~控除1のcolumn値-1」「控除1のcolumn値~時間外手当のcolumn値-1」「それ以外」みたいなイメージで分割できないかと考えているのですが、可能でしょうか?
上記以外でももしよりよい方法をご存知でしたらご教授いただければ幸いです。
お手数おかけしますがよろしくお願いします。

なるほど。詳細不明なのでなんとも言えませんが、膨大な列数に対してFilter Rowのところに条件入れて、合致したのを抜き出す事は、実業務でもやってます。

頑張ってください。

可能です。

colIdx控除1 = dt.Columns("控除1").Ordinal
colIdx時間外手当 = dt.Columns("時間外手当").Ordinal

としておいて

dt.DefaultView.ToTable(False,dt.Columns.Cast(Of DataColumn).Select(Function(dc) dc.ColumnName).Where(Function(s,idx) idx>=0 AndAlso idx<colIdx控除1).ToArray)

あるいは

dt.DefaultView.ToTable(False,dt.Columns.Cast(Of DataColumn).Select(Function(dc) dc.ColumnName).Where(Function(s,idx) idx>=colIdx控除1 AndAlso idx<colIdx時間外手当).ToArray)

のようにすれば良いかと思います。