Yanıtlar:
Çok sayıda çözüm kullanabilirsiniz. Varolan bir tabloyu temel alan yeni bir tablo oluşturmak istediğinizi varsayalım. Bu, yeni tabloyu üreten kod bloklarını tanımladığınız babil işlevini içerir. Kod blokları birçok dilde olabilir ve daha sonra tablo formüllerinde normal olarak kullanılacak böyle bir kod bloğunu bile tanımlayabilirsiniz.
Burada sadece emacs lisp kullanan bir örnek gösteriyorum. Github'daki örnek koleksiyonumda daha birçok örnek bulabilirsiniz: 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 |
Şimdi gerekli değerlere sahip yeni bir tablo üreten bir filtre fonksiyonu tanımladık.
# + İSİM: filtrem # + BEGIN_SRC elisp: var tbl = table1 val = "ABD": colnames y (tbl'deki satır için cl-loop if (eşit (n. 3 satır) val) newtbl içine satır toplamak nihayet newtbl döndür) # + END_SRC # + SONUÇLAR: filtrem | col1 | col2 | col3 | col4 | col5 | | ------ + ------ + ------ + ------ + ------ | | sıra4 | 8 | JP | ABD | 20 | | row8 | 16 | PL | ABD | 40 |
Bu işlevi org modu CALL sözdizimi ile de kullanabilirim
# + ARAMA: filtrem (tbl = tablo1, val = "CN"): y # + SONUÇLAR: | col1 | col2 | col3 | col4 | col5 | | ------ + ------ + ------ + ------ + ------ | | sıra1 | 2 | D | CN | 5 | | row7 | 14 | D | CN | 35 |
Burada ayrıca, 3 veya 4 sütunlarında dizeyi içeren tüm satırları filtrelemek için orijinal gereksiniminizi kullandığım SQLite yaklaşımını da göstereceğim. bir SQLite DB.
# + İSİM: my-filter2 # + BEGIN_SRC sqlite: db table1.sqlite: var tbl = table1 val = "ABD": colnames yes varsa tabloyu düşür table1; tablo table1 oluştur (col1 VARCHAR, col2 INTEGER, col3 VARCHAR, col4 VARCHAR, col5 INTEGER); .import "$ tbl" tablosu1 tablo1'den * seçin; burada col3 = '$ val' veya col4 = '$ val'; # + END_SRC # + SONUÇLAR: | col1 | col2 | col3 | col4 | col5 | | ------ + ------ + ------ + ------ + ------ | | sıra2 | 4 | ABD | PL | 10 | | sıra4 | 8 | JP | ABD | 20 | | row6 | 12 | ABD | JP | 30 | | row8 | 16 | PL | ABD | 40 | # + ÇAĞRI: my-filter2 (tbl = tablo1, val = "CN"): sütun adları y # + SONUÇLAR: | col1 | col2 | col3 | col4 | col5 | | ------ + ------ + ------ + ------ + ------ | | sıra1 | 2 | D | CN | 5 | | row3 | 6 | CN | D | 15 | | row7 | 14 | D | CN | 35 | | row9 | 18 | CN | D | 45 |
Sorunuzu doğru bir şekilde anladığımı ve bağlantıların bir çözümün diğer varyasyonlarını bulmanıza yardımcı olduğunu umuyorum.
symbol-name
Emacs Lisp çözümünde başarılı olmak için işlevi silmek zorunda kaldım . Sadece bahsetmek için.
Kullandığım q - Veri olarak Metin ve benim 2 işlevleri library-of-babel
( Konf-Örnek ) kolay sağlamak sql sorgusuna arayüzü / org-inline tabloları ve dış katılmak .*sv
dosyaları.
Kaputun altında, q
( python aracılığıyla ) @dfeich'in ikinci yaklaşımı gibi sqlite de kullanır , ancak her bir kaynak tabloya özgü gürültülü kazan plakası koduna olan ihtiyacı ortadan kaldırır . Genellikle bir kez sistem paket yöneticisi aracılığıyla bir kez kurulması gerekir python-q-text-as-data
.
Babel kitaplığınız aşağıdaki 2 işlevle yüklendikten sonra, #+Call:
SQL sorgularını kullanmak için kuruluş dosyanızda yalnızca aşağıdaki gibi bir şeye ihtiyacınız vardır .
#+CALL: Q[:stdin table1](where="col4=='USA'")
#+RESULTS:
| col1 | col2 | col3 | col4 | col5 |
|------+------+------+------+------|
| row4 | 8 | JP | USA | 20 |
| row8 | 16 | PL | USA | 40 |
Bu SELECT $select FROM $from WHERE $where
, parametrelerin stdin
çıktı için tüm sütunları seçmesi için varsayılanları içeren bir komut satırı oluşturur .
Kitaplığınıza eklenecek kod blokları:
** 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