組織モードでテーブルをフィルタリングするにはどうすればよいですか


11

たとえば、テーブルをフィルタリングして、列3と4に「USA」文字列のみを含む行を表示するようにします。

回答:


19

多数のソリューションを使用できます。既存のテーブルに基づいて新しいテーブルを作成するとします。これには、新しいテーブルを生成するコードブロックを定義するバベル機能が含まれます。コードブロックは多くの言語で使用でき、そのようなコードブロックを定義して、後で通常はテーブルの数式で使用することもできます。

ここでは、emacs lispを使用した例を示しています。githubのサンプルコレクションには、さらに多くの例があります。https//github.com/dfeich/org-babel-examples

 *table filter

  #+NAME: table1
  | col1  | col2 | col3 | col4 | col5 |
  |-------+------+------+------+------|
  | row0  |    0 | CH   | CH   |    0 |
  | row1  |    2 | D    | CN   |    5 |
  | row2  |    4 | USA  | PL   |   10 |
  | row3  |    6 | CN   | D    |   15 |
  | row4  |    8 | JP   | USA  |   20 |
  | row5  |   10 | PL   | PL   |   25 |
  | row6  |   12 | USA  | JP   |   30 |
  | row7  |   14 | D    | CN   |   35 |
  | row8  |   16 | PL   | USA  |   40 |
  | row9  |   18 | CN   | D    |   45 |
  | row10 |   20 | CH   | CH   |   50 |

次に、必要な値を持つ新しいテーブルを生成するフィルター関数を定義します。

  • 前の表では、BEGIN行で:var tbl = table1引数を使用しています。
  • val = "USA"を設定して、同じ:var割り当てでフィルタリングする値を定義します
  • 列見出しを保持するために、BEGIN行で:colnames引数を使用していることに注意してください。
  • 簡単にするために、これらの例では列4のみをフィルタリングします。しかし、拡張するのは簡単です。明示的な解決策が必要な場合は、質問してください。
  #+ NAME:my-filter
  #+ BEGIN_SRC elisp:var tbl = table1 val = "USA":colnames y
    (tblの行のclループ
          if(等しい(n番目の3行)val)
          行をnewtblに収集する
          最後にnewtblを返す)
  #+ END_SRC

  #+結果:my-filter
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | 行4 | 8 | JP | アメリカ| 20 |
  | row8 | 16 | PL | アメリカ| 40 |

この関数は、org-mode CALL構文でも使用できます。

  #+ CALL:my-filter(tbl = table1、val = "CN"):colnames y

  #+結果:
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | 行1 | 2 | D | CN | 5 |
  | row7 | 14 | D | CN | 35 |

ここでは、列3または4のいずれかに文字列を含むすべての行をフィルタリングするという元の要件を使用するSQLiteアプローチも示します。sqliteアプローチのマイナーな欠点は、テーブルを読み取って作成するボイラープレートコードがあることです。 SQLite DB。

  #+ NAME:my-filter2
  #+ BEGIN_SRC sqlite:db table1.sqlite:var tbl = table1 val = "USA":colnamesはい
    table1が存在する場合はテーブルをドロップし、
    テーブルtable1を作成します(col1 VARCHAR、col2 INTEGER、col3 VARCHAR、
    col4 VARCHAR、col5 INTEGER);
    .import "$ tbl" table1
    * table1から、col3 = '$ val'またはcol4 = '$ val'を選択します。
  #+ END_SRC

  #+結果:
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | 行2 | 4 | アメリカ| PL | 10 |
  | 行4 | 8 | JP | アメリカ| 20 |
  | row6 | 12 | アメリカ| JP | 30 |
  | row8 | 16 | PL | アメリカ| 40 |


  #+ CALL:my-filter2(tbl = table1、val = "CN"):colnames y

  #+結果:
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | 行1 | 2 | D | CN | 5 |
  | 行3 | 6 | CN | D | 15 |
  | row7 | 14 | D | CN | 35 |
  | row9 | 18 | CN | D | 45 |

私があなたの質問を正しく理解し、リンクがソリューションの他のバリエーションを見つけるのに役立つことを願っています。


素晴らしいソリューション。sqliteとgnuplotを使用すると、優れた経済性で単一のソーステーブルから複数のプロットを生成できます。
Emacsユーザー

素晴らしい解決策をありがとう!ところで、私の環境ではsymbol-name、Emacs Lispソリューションで成功するために関数を削除する必要がありました。言及のためだけに。
RUserPassingBy

ありがとう。国名をシンボルとして使用してsrcブロックによって直接作成されたテーブルから元の例を準備したことに気づいたので、フィルターは実際には文字列ではなくシンボルとして渡されました。現在は修正されています。
dfeich

0

私はq-Text as Dataと私のlibrary-of-babelConf-Example)の2つの関数を使用して、組織インラインテーブルと外部ファイルをクエリ/結合する簡単なインターフェイスを提供してい.*svます。

フードの下で、q(VIA )も使用し @dfeichから第二のアプローチのような、しかし削除各個々のソーステーブルに騒々しい定型コードの特定の必要性。通常は、システムパッケージマネージャーを介して一度インストールするだけpython-q-text-as-dataです。

バベルのライブラリに以下の2つの関数がロードされたら、#+Call:SQLクエリを使用するには、org-fileに以下のようなものだけが必要です。

#+CALL: Q[:stdin table1](where="col4=='USA'")

#+RESULTS:
| col1 | col2 | col3 | col4 | col5 |
|------+------+------+------+------|
| row4 |    8 | JP   | USA  |   20 |
| row8 |   16 | PL   | USA  |   40 |

これにより、のようなコマンドラインSELECT $select FROM $from WHERE $whereが作成さstdinれます。デフォルトでは、すべての列が出力用に選択されます。

ライブラリに追加するコードブロックは次のとおりです。

** Add a header Row to tables
#+name: addhdr
#+begin_src emacs-lisp :var tbl=""
(cons (car tbl) (cons 'hline (cdr tbl)))
#+end_src

** Filtering with SQL
#+NAME: Q
#+HEADER: :results value table
#+HEADER: :var callOptsStd="-H -O -t" callOpts=""
#+HEADER: :post addhdr(*this*)
#+BEGIN_SRC shell :stdin Ethers :var select="*" from="-" where="1"
q $callOptsStd $callOpts "Select $select from $from where $where"
#+END_SRC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.