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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.87344 の関連記事表示

<< 0 >>
■87344  datatableの条件抽出について
□投稿者/ kenta -(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();


親記事 /過去ログ150より / 関連記事表示
削除チェック/

■87347  Re[1]: datatableの条件抽出について
□投稿者/ WebSurfer -(2018/05/14(Mon) 12:18:28)
    No87344 (kenta さん) に返信

    > 上手くいきません。

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

    コードの実行結果はどうなったのか、期待とはどこが異なるのかを書いていただけませんか。
記事No.87344 のレス /過去ログ150より / 関連記事表示
削除チェック/

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

    Console.WriteLine(columns["A"]);
    ↓↓↓
    Console.WriteLine(columns["B"]);
記事No.87344 のレス /過去ログ150より / 関連記事表示
削除チェック/

■87349  Re[1]: datatableの条件抽出について
□投稿者/ 魔界の仮面弁士 -(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 で '>=' 操作を実行できません。
    の例外になってしまうことでしょう。
記事No.87344 のレス /過去ログ150より / 関連記事表示
削除チェック/

■87350  Re[2]: datatableの条件抽出について
□投稿者/ kenta -(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ではないの?)


    以上、よろしくお願いします。
記事No.87344 のレス /過去ログ150より / 関連記事表示
削除チェック/

■87351  Re[3]: datatableの条件抽出について
□投稿者/ 魔界の仮面弁士 -(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();
    }
記事No.87344 のレス /過去ログ150より / 関連記事表示
削除チェック/

■87358  Re[4]: datatableの条件抽出について
□投稿者/ WebSurfer -(2018/05/15(Tue) 11:08:55)
記事No.87344 のレス /過去ログ150より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -