Як я можу фільтрувати таблицю в режимі org


11

Наприклад, я хочу відфільтрувати таблицю, за якою вона відображає рядок, який містить лише рядок "США" у стовпцях 3 та 4.

Відповіді:


19

Можна використовувати безліч рішень. Я припускаю, що ви хочете створити нову таблицю на основі існуючої. Це включає функціональну функцію, коли ви визначаєте кодові блоки, які створюють нову таблицю. Блоки коду можуть бути багатьма мовами, і ви навіть можете визначити такий код коду, який згодом зазвичай використовується у формулах таблиць.

Я показую тут лише приклад, використовуючи 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 |

Тепер ми визначимо функцію фільтра, яка створює нову таблицю з необхідними значеннями.

  • Я читаю в попередній таблиці, використовуючи аргумент : var tbl = table1 у рядку BEGIN.
  • Я визначаю значення для фільтрування в тому ж самому : присвоєння var , встановивши val = "США"
  • Зауважте, що я використовую аргумент : colnames у рядку BEGIN, щоб зберегти заголовки стовпців.
  • У цих прикладах я фільтрую лише колонку 4 для простоти. Але тривіально продовжувати. Якщо ви хочете чіткого рішення, просто запитайте.
  # + NAME: мій фільтр
  # + BEGIN_SRC elisp: var tbl = table1 val = "США": назви y
    (cl-петля для рядка в tbl
          if (рівний (nth 3 ряд) val)
          збирати рядок у newtbl
          нарешті повернути newtbl)
  # + END_SRC

  # + РЕЗУЛЬТАТИ: мій-фільтр
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | ряд4 | 8 | JP | США | 20 |
  | ряд8 | 16 | PL | США | 40 |

Я також можу використовувати цю функцію в синтаксисі CALL в режимі org

  # + CALL: мій-фільтр (tbl = table1, val = "CN"): імена y

  # + РЕЗУЛЬТАТИ:
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | рядок1 | 2 | Д | CN | 5 |
  | ряд7 | 14 | Д | CN | 35 |

Я також демонструю тут підхід SQLite, коли я використовую вашу первісну вимогу фільтрувати всі рядки, які містять рядок, або в стовпцях 3 або 4. Невеликим недоліком підходу sqlite є те, що у нас є якийсь код коробки, який слід прочитати в таблиці та створити SQLite БД.

  # + NAME: my-filter2
  # + BEGIN_SRC sqlite: db table1.sqlite: var tbl = table1 val = "USA": назви так
    падаюча таблиця, якщо існує table1;
    створити таблицю таблиці1 (col1 VARCHAR, col2 INTEGER, col3 VARCHAR,
    col4 VARCHAR, col5 INTEGER);
    .імпортувати таблицю "$ tbl "1
    виберіть * з таблиці1, де col3 = '$ val' або col4 = '$ val';
  # + END_SRC

  # + РЕЗУЛЬТАТИ:
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | рядок2 | 4 | США | PL | 10 |
  | ряд4 | 8 | JP | США | 20 |
  | ряд6 | 12 | США | JP | 30 |
  | ряд8 | 16 | PL | США | 40 |


  # + CALL: my-filter2 (tbl = table1, val = "CN"): імена y

  # + РЕЗУЛЬТАТИ:
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | рядок1 | 2 | Д | CN | 5 |
  | ряд3 | 6 | CN | Д | 15 |
  | ряд7 | 14 | Д | CN | 35 |
  | ряд9 | 18 | CN | Д | 45 |

Сподіваємось, що я правильно зрозумів ваше запитання і що посилання допоможуть вам знайти інші варіанти рішення.


Прекрасне рішення. За допомогою sqlite та gnuplot можна створити кілька сюжетів з однієї таблиці джерел із великою економією.
Користувач Emacs

Дякую за чудове рішення! До речі, в моєму середовищі мені довелося видалити symbol-nameфункцію, щоб досягти успіху в рішенні Emacs Lisp. Тільки для згадки.
RUserPassingБерезень

Дякую. Тепер я зрозумів, що підготував свій оригінальний приклад із таблиці, створеної безпосередньо блоком src, використовуючи назви країн як символи, тому фільтр насправді передав символи, а не рядки. Зараз це виправлено.
dfeich

0

Я використовую q - Текст як дані та 2 функції в моєму library-of-babel( Conf-Example ), щоб забезпечити простий інтерфейс для запиту / приєднання org-inline таблиць та зовнішніх .*svфайлів.

Під кришкою q(через ) також використовується , як і другий підхід від @dfeich, але знімається потреба у галасливому кодовому коді-коду, характерному для кожної окремої таблиці джерел. Його просто потрібно встановити один раз через менеджер системних пакетів, як правило, в python-q-text-as-data.

Після завантаження вашої бібліотеки вавилонів з 2-х функцій, наведених #+Call:нижче, у вашому org-файлі вам знадобиться лише подібне нижче, щоб використовувати SQL-запити.

#+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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.