回答:
多数のソリューションを使用できます。既存のテーブルに基づいて新しいテーブルを作成するとします。これには、新しいテーブルを生成するコードブロックを定義するバベル機能が含まれます。コードブロックは多くの言語で使用でき、そのようなコードブロックを定義して、後で通常はテーブルの数式で使用することもできます。
ここでは、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 |
次に、必要な値を持つ新しいテーブルを生成するフィルター関数を定義します。
#+ 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 |
私があなたの質問を正しく理解し、リンクがソリューションの他のバリエーションを見つけるのに役立つことを願っています。
symbol-name
、Emacs Lispソリューションで成功するために関数を削除する必要がありました。言及のためだけに。
私はq-Text as Dataと私のlibrary-of-babel
(Conf-Example)の2つの関数を使用して、組織インラインテーブルと外部ファイルをクエリ/結合する簡単なSQLインターフェイスを提供してい.*sv
ます。
フードの下で、q
(VIA のpython)も使用したSQLiteを @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