Wie kann ich eine Tabelle im Organisationsmodus filtern?

11

Zum Beispiel möchte ich eine Tabelle filtern, in der die Zeile angezeigt wird, die nur die Zeichenfolge "USA" in den Spalten 3 und 4 enthält.

Yuxuan
quelle

Antworten:

19

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.

  • Ich lese in der vorherigen Tabelle mit dem Argument : var tbl = table1 in der Zeile BEGIN.
  • Ich definiere den zu filternden Wert im selben : var Zuweisung durch Setzen von val = "USA"
  • Beachten Sie, dass ich das Argument : colnames in der Zeile BEGIN verwende, um die Spaltenüberschriften beizubehalten.
  • Der Einfachheit halber filtere ich in diesen Beispielen nur Spalte 4. Aber es ist trivial zu erweitern. Wenn Sie die explizite Lösung wünschen, fragen Sie einfach.
  # + 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.

dfeich
quelle
Tolle Lösung. Mit SQLite und Gnuplot können mehrere Diagramme aus einer einzigen Quelltabelle mit großer Wirtschaftlichkeit erstellt werden.
Emacs User
Vielen Dank für die tolle Lösung! Übrigens musste ich in meiner Umgebung die symbol-nameFunktion löschen , um in der Emacs Lisp-Lösung erfolgreich zu sein. Nur um es zu erwähnen.
RUserPassingBy
Vielen Dank. Erst jetzt wurde mir klar, dass ich mein ursprüngliches Beispiel aus einer Tabelle vorbereitet hatte, die direkt von einem src-Block unter Verwendung der Ländernamen als Symbole erstellt wurde, sodass dem Filter tatsächlich Symbole und keine Zeichenfolgen übergeben wurden. Es ist jetzt korrigiert.
dfeich
0

Ich verwende q - Text als Daten und 2 Funktionen in meinem library-of-babel( Conf-Beispiel ), um eine einfache Schnittstelle zum Abfragen / Verknüpfen von Organisations-Inline-Tabellen und externen .*svDateien bereitzustellen .

Unter der Haube q(via ) verwendet auch , 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 $wheremit Standardeinstellungen für die Parameter erstellt, aus denen alle Spalten stdinfü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
Alex Stragies
quelle