조직 모드에서 테이블을 필터링하는 방법


11

예를 들어, 3 열과 4 열에 "USA"문자열 만 포함하는 행을 표시하도록 테이블을 필터링하려고합니다.

답변:


19

다양한 솔루션을 사용할 수 있습니다. 기존 테이블을 기반으로 새 테이블을 생성한다고 가정합니다. 여기에는 새 테이블을 생성하는 코드 블록을 정의하는 babel 기능이 포함됩니다. 코드 블록은 여러 언어로 제공 될 수 있으며 나중에 테이블 수식에서 일반적으로 사용되도록 이러한 코드 블록을 정의 할 수도 있습니다.

여기서는 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 |

이제 필요한 값으로 새 테이블을 생성하는 필터 함수를 정의합니다.

  • BEGIN 줄에서 : var tbl = table1 인수를 사용하여 이전 표를 읽었습니다 .
  • val = "USA"를 설정 하여 동일한 : var 할당 에서 필터링 할 값을 정의합니다 .
  • 열 제목을 유지하기 위해 BEGIN 줄에 : colnames 인수를 사용하고 있습니다.
  • 이 예제에서는 단순성을 위해 열 4 만 필터링합니다. 그러나 확장하는 것은 사소한 일입니다. 명시적인 해결책을 원하면 물어보십시오.
  # + NAME : 내 필터
  # + BEGIN_SRC elisp : var tbl = table1 val = "USA": colnames y
    (tbl의 행에 대한 cl 루프
          if (같은 (n 번째 3 행) val)
          newtbl에 행을 수집
          마지막으로 newtbl을 반환)
  # + END_SRC

  # + 결과 : 내 필터
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | row4 | 8 | 일본 | 미국 | 20 |
  | 행 8 | 16 | PL | 미국 | 40 |

이 기능을 org-mode CALL 구문과 함께 사용할 수도 있습니다

  # + 통화 : my-filter (tbl = table1, val = "CN") : colnames y

  # + 결과 :
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | row1 | 2 | D | CN | 5 |
  | row7 | 14 | D | CN | 35 |

또한 여기에서 열 3 또는 4에 문자열을 포함하는 모든 행을 필터링하는 원래 요구 사항을 사용하는 SQLite 접근 방식을 보여줍니다. SQLite DB.

  # + NAME : 내 필터 2
  # + BEGIN_SRC sqlite : db table1.sqlite : var tbl = table1 val = "USA": colnames 예
    존재하는 경우 테이블 삭제
    테이블 table1 작성 (col1 VARCHAR, col2 INTEGER, col3 VARCHAR,
    col4 VARCHAR, col5 정수);
    .import "$ tbl"table1
    col3 = '$ val'또는 col4 = '$ val'인 table1에서 *를 선택하십시오.
  # + END_SRC

  # + 결과 :
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | row2 | 4 | 미국 | PL | 10 |
  | row4 | 8 | 일본 | 미국 | 20 |
  | 6 행 | 12 | 미국 | 일본 | 30 |
  | 행 8 | 16 | PL | 미국 | 40 |


  # + 통화 : my-filter2 (tbl = table1, val = "CN") : colnames y

  # + 결과 :
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | row1 | 2 | D | CN | 5 |
  | 행 3 | 6 | CN | D | 15 |
  | row7 | 14 | D | CN | 35 |
  | 행 9 | 18 | CN | D | 45 |

귀하의 질문을 올바르게 이해하고 링크가 솔루션의 다른 변형을 찾는 데 도움이되기를 바랍니다.


훌륭한 솔루션. sqlite 및 gnuplot을 사용하면 단일 소스 테이블에서 여러 플롯을 경제적으로 생성 할 수 있습니다.
Emacs 사용자

훌륭한 솔루션에 감사드립니다! BTW, 내 환경 symbol-name에서 Emacs Lisp 솔루션에서 성공 하려면 기능을 삭제해야했습니다 . 그냥 언급하십시오.
RUserPassingBy

감사. 국가 이름을 기호로 사용하여 src 블록으로 직접 생성 된 테이블에서 원래 예제를 준비 했으므로 필터는 실제로 문자열이 아닌 기호로 처리되었습니다. 이제 수정되었습니다.
dfeich

0

나는 q-Text as Data , 그리고 library-of-babel( Conf-Example )에 2 개의 함수 를 사용하여 org-inline 테이블 및 외부 파일 을 쿼리 / 가입 하기 쉬운 인터페이스를 제공 .*sv합니다.

후드 아래 q(통해 )도 사용 @dfeich에서 두 번째 방법처럼하지만 제거 개별 소스 테이블 잡음 상용구 코드 특정의 필요성이. 일반적으로 시스템 패키지 관리자를 통해 한 번만 설치하면됩니다 python-q-text-as-data.

babel 라이브러리에 아래 2 개의 함수가로드되면 #+Call:SQL 쿼리를 사용하려면 아래의 org-file 만 필요 합니다.

#+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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.