Kuruluş modunda tabloyu nasıl filtreleyebilirim


11

Örneğin, sütun 3 ve 4'te yalnızca "ABD" dizesini içeren satırı gösteren tabloya filtre uygulamak istiyorum.

Yanıtlar:


19

Ç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.

  • BEGIN satırında : var tbl = table1 bağımsız değişkenini kullanarak önceki tabloda okuyorum .
  • Aynı filtre uygulanacak değeri tanımlamak : val = "USA" ayarlayarak var atama
  • Sütun başlıklarını korumak için BEGIN satırında : colnames bağımsız değişkenini kullandığım dikkat edin .
  • Bu örneklerde yalnızca 4. sütunu basitlik için filtreliyorum. Ancak uzatmak önemsizdir. Açık bir çözüm istiyorsanız, sorun.
  # + İ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.


Harika bir çözüm. Sqlite ve gnuplot ile, büyük bir ekonomi ile tek bir kaynak tablodan birden fazla parsel üretilebilir.
Emacs Kullanıcısı

Mükemmel çözüm için teşekkürler! BTW, çevremdeki symbol-nameEmacs Lisp çözümünde başarılı olmak için işlevi silmek zorunda kaldım . Sadece bahsetmek için.
RUserPassingBy

Teşekkürler. Sadece orijinal örneğimi, ülke isimlerini sembol olarak kullanan bir src bloğu tarafından doğrudan üretilen bir tablodan hazırladığımı fark ettim, böylece filtre aslında dizeleri değil, sembolleri verdi. Şimdi düzeltildi.
dfeich

0

Kullandığım q - Veri olarak Metin ve benim 2 işlevleri library-of-babel( Konf-Örnek ) kolay sağlamak sorgusuna arayüzü / org-inline tabloları ve dış katılmak .*svdosyaları.

Kaputun altında, q( aracılığıyla ) @dfeich'in ikinci yaklaşımı gibi 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.