C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

datatableの条件抽出について

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■87344 / inTopicNo.1)  datatableの条件抽出について
  
□投稿者/ kenta (1回)-(2018/05/14(Mon) 11:46:38)

分類:[C#] 


分類:[C#]

こんにちは
visualstudio2017において、csvファイルをdatatableに取り込みました。
次にそのdatatableから以下のように条件付け抽出して再びdatatableに取り込みたいと考えています(今はとりあえずコンソールに表示)
が上手くいきません。どなたか教えて下さい。

A B C D E ←(列名)                       A
1 2 3 4 5                              6
6 7 8 9 1       ⇒ 条件:列Aにおいて6以上を抽出 ⇒  7
2 3 4 5 6
7 8 9 1 2

作成コード
DataRow[] ary = ds.Table["TableA"] .select("A>=6");
froreach(var columns in ary)
{
Console.WriteLine(columns["A"]);

}
Console.WriteLine();



引用返信 編集キー/
■87346 / inTopicNo.2)  Re[1]: datatableの条件抽出について
□投稿者/ furu (167回)-(2018/05/14(Mon) 12:14:41)
No87344 (kenta さん) に返信
答えに7(列B)がほしい?

Console.WriteLine(columns["A"]);
↓↓↓
Console.WriteLine(columns["B"]);
引用返信 編集キー/
■87347 / inTopicNo.3)  Re[1]: datatableの条件抽出について
□投稿者/ WebSurfer (1490回)-(2018/05/14(Mon) 12:18:28)
No87344 (kenta さん) に返信

> 上手くいきません。

どのよう上手くいかなかったかわかりません。

コードの実行結果はどうなったのか、期待とはどこが異なるのかを書いていただけませんか。
引用返信 編集キー/
■87349 / inTopicNo.4)  Re[1]: datatableの条件抽出について
□投稿者/ 魔界の仮面弁士 (1662回)-(2018/05/14(Mon) 12:36:50)
No87344 (kenta さん) に返信
> 条件:列Aにおいて6以上を抽出
この場合は、A列が「6」の行と、A列が「7」の行が得られれば良いのですね?


> DataRow[] ary = ds.Table["TableA"] .select("A>=6");
『ds.Table["TableA"] .select("A>=6")』ではなく
『ds.Tables[TableA"].Select("A>=6")』ですよ。


> froreach(var columns in ary)
『froreach』ではなく
『foreach』ですね。


> csvファイルをdatatableに取り込みました。
datatable → DataTable というのはさておき。

その csv によって、TableA テーブルと、A 列が用意されていたとして、
その A 列というのは、int 型のフィールドになっているでしょうか?

もしも A 列 が string 型のフィールドになっていて、そこに
半角数字の "6" ではなく、全角数字の "6" がセットされていたり、
あるいは "6.0" などの、int にならない値がセットされていたりすると
 System.Data.EvaluateException
  System.String および System.Int32 で '>=' 操作を実行できません。
の例外になってしまうことでしょう。
引用返信 編集キー/
■87350 / inTopicNo.5)  Re[2]: datatableの条件抽出について
□投稿者/ kenta (2回)-(2018/05/14(Mon) 13:19:55)
□投稿者/ 魔界の仮面弁士 (1662回)-(2018/05/14(Mon) 12:36:50)
No87344 (kenta さん) に返信
> 条件:列Aにおいて6以上を抽出
この場合は、A列が「6」の行と、A列が「7」の行が得られれば良いのですね?
⇒その通りです。


急いでPCに入力してしまったために、入力ミスが多く出てしまいました。
すいません。

再びコードを表示するとともに、さらに詳細に記入ます。


DataRow[] ary = ds.Tables["TableA"].Select("A>=700");
foreach (var columns in ary)
{
Console.WriteLine(columns["A"]);
}
Console.WriteLine();

■取り込んだCSVデータは以下のデータです(とりあえずA列のみ)

A  B  C  D  E
1
2
3
.
.
.
800


■出力結果(本来は縦に出力されるが、ここではそれを横に並べる) 

100,101,102,103,104,105,106,107,108,109,11,110,111,................798

↑(なんで11?)      ↑(800ではないの?)


以上、よろしくお願いします。

引用返信 編集キー/
■87351 / inTopicNo.6)  Re[3]: datatableの条件抽出について
□投稿者/ 魔界の仮面弁士 (1663回)-(2018/05/14(Mon) 15:01:33)
2018/05/15(Tue) 11:43:46 編集(投稿者)

No87350 (kenta さん) に返信
> 取り込んだCSVデータは以下のデータです(とりあえずA列のみ)
Console.WriteLine( ds.Tables["TableA"].Columns["A"].DataType.FullName );
は "System.Int32" でしょうか。"System.String" でしょうか。あるいはそれ以外?


もしも String だとすると、"1" < "1ab" < "2" の関係が成り立つので、
大小関係が "1" < "10" < "2" の並びになること注意してください。


> DataRow[] ary = ds.Tables["TableA"].Select("A>=700");
今度は「700以上」にしたいのですね?


> ,11,
> ↑(なんで11?)
あれ? 「700以上」なのに 100 が現れた点はスルーですか?
条件は「A>=100」というわけでも無いですよね。

No87344 の条件は「A>=6」でしたが
No87350 の条件は「A>=700」で良いのですよね?



> ,798
> ↑(800ではないの?)

static void Main(string[] args)
{
  // TableA の A 列は int 型
  // TableB の A 列は string 型
  var ds = new DataSet();
  ds.Tables.Add("TableA").Columns.Add("A", typeof(int));
  ds.Tables.Add("TableB").Columns.Add("A", typeof(string));
  for (int a = 1; a <= 800; a++)
  {
    ds.Tables["TableA"].Rows.Add(a);
    ds.Tables["TableB"].Rows.Add(a.ToString());
  }
  ds.AcceptChanges();

  // 上記までは事前準備
  // 以下は No87350 のコードの検証

  Console.WriteLine("int 比較なら問題は無い");  // 1 < 2 < 10 の関係
  DataRow[] ary = ds.Tables["TableA"].Select("A>=700"); // int比較
  foreach (var columns in ary)
  {
    Console.Write(columns["A"] + ",");
  }
  Console.WriteLine();
  Console.WriteLine();

  Console.WriteLine("string比較の場合は注意");  // "1" < "10" < "2" の関係
  // https://social.msdn.microsoft.com/Forums/ja-JP/6f99460f-ffae-40ce-b96b-ab1670ee977f/
  // 上記の理由により、下記はエラーになりえるので、指定してはいけない
  // ary = ds.Tables["TableB"].Select("A>=700"); // 型が違う
  // なので、こう書かねばならない(それが期待する結果であるかは別として)
  ary = ds.Tables["TableB"].Select("A>='700'"); // string比較
  foreach (var columns in ary)
  {
    Console.Write(columns["A"] +",");
  }
  Console.WriteLine();
  Console.WriteLine();

  // あるいは…
  Console.WriteLine("CONVERT関数でまとめてからという手もあるが、効率は落ちる");
  ary = ds.Tables["TableB"].Select("CONVERT(A, System.Int32)>=700"); // int比較
  foreach (var columns in ary)
  {
    Console.Write(columns["A"] +",");
  }
  Console.WriteLine();
  Console.WriteLine();


  Console.ReadLine();
}
引用返信 編集キー/
■87358 / inTopicNo.7)  Re[4]: datatableの条件抽出について
□投稿者/ WebSurfer (1492回)-(2018/05/15(Tue) 11:08:55)
マルチポストのようですので他のポスト先の url を貼っておきます。

https://teratail.com/questions/126060
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ