Antworten:
Sie können eine Vielzahl von Lösungen verwenden. Ich gehe davon aus, dass Sie eine neue Tabelle basierend auf einer vorhandenen erstellen möchten. Dies beinhaltet die Babel-Funktionalität, bei der Sie Codeblöcke definieren, die die neue Tabelle erzeugen. Die Codeblöcke können in vielen Sprachen vorliegen, und Sie können sogar einen solchen Codeblock definieren, der anschließend normalerweise in Tabellenformeln verwendet wird.
Ich zeige hier nur ein Beispiel mit emacs lisp. Weitere Beispiele finden Sie in meiner Beispielsammlung auf 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 |
Nun definieren wir eine Filterfunktion, die eine neue Tabelle mit den erforderlichen Werten erzeugt.
# + NAME: Mein Filter # + BEGIN_SRC elisp: var tbl = table1 val = "USA": Spaltennamen y (cl-Schleife für Zeile in tbl if (gleich (nth 3 row) val) sammle Zeile in newtbl endlich zurück newtbl) # + END_SRC # + ERGEBNISSE: my-filter | col1 | col2 | col3 | col4 | col5 | | ------ + ------ + ------ + ------ + ------ | | row4 | 8 | JP | USA | 20 | | row8 | 16 | PL | USA | 40 |
Ich kann diese Funktion auch mit der CALL-Syntax im Organisationsmodus verwenden
# + CALL: my-filter (tbl = table1, val = "CN"): Spaltennamen y # + ERGEBNISSE: | col1 | col2 | col3 | col4 | col5 | | ------ + ------ + ------ + ------ + ------ | | row1 | 2 | D | CN | 5 | | row7 | 14 | D | CN | 35 |
Ich zeige hier auch den SQLite-Ansatz, bei dem ich Ihre ursprüngliche Anforderung verwende, alle Zeilen zu filtern, die die Zeichenfolge entweder in den Spalten 3 oder 4 enthalten. Ein kleiner Nachteil des SQLite-Ansatzes besteht darin, dass wir einen Boilerplate-Code zum Lesen und Erstellen der Tabelle haben eine SQLite-Datenbank.
# + NAME: my-filter2 # + BEGIN_SRC sqlite: db table1.sqlite: var tbl = table1 val = "USA": Spaltennamen yes drop table falls vorhanden table1; Tabelle erstellen table1 (col1 VARCHAR, col2 INTEGER, col3 VARCHAR, col4 VARCHAR, col5 INTEGER); .import "$ tbl" table1 Wählen Sie * aus Tabelle1 aus, wobei col3 = '$ val' oder col4 = '$ val'; # + END_SRC # + ERGEBNISSE: | col1 | col2 | col3 | col4 | col5 | | ------ + ------ + ------ + ------ + ------ | | row2 | 4 | USA | PL | 10 | | row4 | 8 | JP | USA | 20 | | row6 | 12 | USA | JP | 30 | | row8 | 16 | PL | USA | 40 | # + CALL: my-filter2 (tbl = table1, val = "CN"): Spaltennamen y # + ERGEBNISSE: | col1 | col2 | col3 | col4 | col5 | | ------ + ------ + ------ + ------ + ------ | | row1 | 2 | D | CN | 5 | | row3 | 6 | CN | D | 15 | | row7 | 14 | D | CN | 35 | | row9 | 18 | CN | D | 45 |
Ich hoffe, dass ich Ihre Frage richtig verstanden habe und dass die Links Ihnen helfen, andere Variationen einer Lösung zu finden.
symbol-name
Funktion löschen , um in der Emacs Lisp-Lösung erfolgreich zu sein. Nur um es zu erwähnen.
Ich verwende q - Text als Daten und 2 Funktionen in meinem library-of-babel
( Conf-Beispiel ), um eine einfache SQL- Schnittstelle zum Abfragen / Verknüpfen von Organisations-Inline-Tabellen und externen .*sv
Dateien bereitzustellen .
Unter der Haube q
(via Python ) verwendet auch SQLite , wie der zweite Ansatz von @dfeich, aber beseitigt die Notwendigkeit , laut vorformulierten-Code spezifisch für jede einzelne Quelltabelle. Es muss nur einmal über den Systempaket-Manager installiert werden, normalerweise in python-q-text-as-data
.
Sobald Ihre Bibliothek von babel mit den 2 folgenden Funktionen geladen ist, benötigen Sie nur noch ein "Gefällt mir" #+Call:
in Ihrer Organisationsdatei, um SQL-Abfragen zu verwenden.
#+CALL: Q[:stdin table1](where="col4=='USA'")
#+RESULTS:
| col1 | col2 | col3 | col4 | col5 |
|------+------+------+------+------|
| row4 | 8 | JP | USA | 20 |
| row8 | 16 | PL | USA | 40 |
Dadurch wird eine Befehlszeile SELECT $select FROM $from WHERE $where
mit Standardeinstellungen für die Parameter erstellt, aus denen alle Spalten stdin
für die Ausgabe ausgewählt werden.
Die Codeblöcke, die Sie Ihrer Bibliothek hinzufügen können, sind:
** 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