Làm cách nào để lọc bảng ở chế độ org


11

Ví dụ: tôi muốn lọc bảng làm cho nó hiển thị hàng chỉ chứa chuỗi "USA" trong cột 3 và 4.

Câu trả lời:


19

Bạn có thể sử dụng vô số giải pháp. Tôi giả sử bạn muốn tạo một bảng mới dựa trên bảng hiện có. Điều này liên quan đến chức năng babel nơi bạn xác định các khối mã tạo ra bảng mới. Các khối mã có thể bằng nhiều ngôn ngữ và thậm chí bạn có thể định nghĩa một khối mã như vậy sẽ được sử dụng sau đó một cách bình thường trong các công thức bảng.

Tôi đang chỉ ra ở đây một ví dụ sử dụng lisp emacs. Bạn có thể tìm thấy nhiều ví dụ khác trong bộ sưu tập ví dụ của tôi trên 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 |

Bây giờ chúng ta xác định hàm lọc tạo ra một bảng mới với các giá trị bắt buộc.

  • Tôi đang đọc trong bảng trước bằng cách sử dụng đối số : var tbl = table1 trong dòng BEGIN.
  • Tôi xác định giá trị sẽ được lọc theo cùng : gán var bằng cách đặt val = "USA"
  • Lưu ý rằng tôi đang sử dụng đối số : colnames trong dòng BEGIN để duy trì các tiêu đề cột.
  • Tôi chỉ lọc cột 4 trong các ví dụ này, để đơn giản. Nhưng nó là tầm thường để mở rộng. Nếu bạn muốn giải pháp rõ ràng, chỉ cần hỏi.
  # + NAME: bộ lọc của tôi
  # + BEGIN_SRC elisp: var tbl = table1 val = "USA": colnames y
    (cl-loop cho hàng trong tbl
          if (bằng (hàng thứ 3) val)
          thu thập hàng vào newtbl
          cuối cùng trả lại newtbl)
  # + END_SRC

  # + KẾT QUẢ: bộ lọc của tôi
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | hàng4 | 8 | JP | Hoa Kỳ | 20 |
  | hàng8 | 16 | PL | Hoa Kỳ | 40 |

Tôi cũng có thể sử dụng chức năng này với cú pháp CALL chế độ org

  # + GỌI: bộ lọc của tôi (tbl = bảng1, val = "CN"): colnames y

  # + KẾT QUẢ:
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | hàng1 | 2 | D | CN | 5 |
  | hàng7 | 14 | D | CN | 35 |

Tôi cũng trình bày ở đây cách tiếp cận SQLite nơi tôi sử dụng yêu cầu ban đầu của bạn là lọc tất cả các hàng có chứa chuỗi trong cột 3 hoặc 4. Một nhược điểm nhỏ của cách tiếp cận sqlite là chúng ta có một số mã soạn sẵn để đọc trong bảng và tạo một DB SQL.

  # + NAME: my-filter2
  # + BEGIN_SRC sqlite: db table1.sqlite: var tbl = table1 val = "USA": colnames yes
    thả bảng nếu tồn tại bảng1;
    tạo bảng bảng1 (col1 VARCHAR, col2 INTEGER, col3 VARCHAR,
    col4 VARCHAR, col5 INTEGER);
    .import "$ tbl" bảng1
    chọn * từ bảng1 trong đó col3 = '$ val' hoặc col4 = '$ val';
  # + END_SRC

  # + KẾT QUẢ:
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | hàng2 | 4 | Hoa Kỳ | PL | 10 |
  | hàng4 | 8 | JP | Hoa Kỳ | 20 |
  | hàng6 | 12 | Hoa Kỳ | JP | 30 |
  | hàng8 | 16 | PL | Hoa Kỳ | 40 |


  # + GỌI: my-filter2 (tbl = table1, val = "CN"): colnames y

  # + KẾT QUẢ:
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | hàng1 | 2 | D | CN | 5 |
  | hàng3 | 6 | CN | D | 15 |
  | hàng7 | 14 | D | CN | 35 |
  | hàng9 | 18 | CN | D | 45 |

Hy vọng rằng tôi hiểu chính xác câu hỏi của bạn và các liên kết giúp bạn tìm các biến thể khác của giải pháp.


Giải pháp tuyệt vời. Với sqlite và gnuplot, nhiều lô từ một bảng nguồn duy nhất có thể được tạo ra với nền kinh tế tuyệt vời.
Người dùng Emacs

Cảm ơn bạn cho giải pháp tuyệt vời! BTW, trong môi trường của tôi, tôi đã phải xóa symbol-namechức năng để thành công trong giải pháp Emacs Lisp. Chỉ cần đề cập đến.
RUserPassingBy

Cảm ơn. Bây giờ tôi chỉ nhận ra rằng tôi đã chuẩn bị ví dụ ban đầu của mình từ một bảng được tạo trực tiếp bởi một khối src bằng cách sử dụng tên quốc gia làm biểu tượng, vì vậy bộ lọc thực sự là biểu tượng được trao chứ không phải chuỗi. Bây giờ nó đã được sửa chữa.
dfeich

0

Tôi sử dụng q - Text as Data và 2 hàm trong library-of-babel( Ví dụ Conf ) của tôi để cung cấp giao diện dễ dàng để truy vấn / tham gia các bảng org-inline và các .*svtệp bên ngoài .

Dưới mui xe, q(thông qua ) cũng sử dụng , giống như cách tiếp cận thứ hai từ @dfeich, nhưng loại bỏ sự cần thiết của mã nồi hơi ồn cụ thể cho từng bảng nguồn riêng lẻ. Nó chỉ cần được cài đặt một lần thông qua trình quản lý gói hệ thống, thường là trong python-q-text-as-data.

Khi thư viện babel của bạn được tải với 2 hàm bên dưới, bạn chỉ cần một lượt #+Call:thích bên dưới trong tệp org của mình để sử dụng các truy vấn SQL.

#+CALL: Q[:stdin table1](where="col4=='USA'")

#+RESULTS:
| col1 | col2 | col3 | col4 | col5 |
|------+------+------+------+------|
| row4 |    8 | JP   | USA  |   20 |
| row8 |   16 | PL   | USA  |   40 |

Điều này xây dựng một dòng lệnh như SELECT $select FROM $from WHERE $where, với mặc định cho các tham số để chọn tất cả các cột từ stdinđầu ra.

Các khối mã để thêm vào thư viện của bạn là:

** 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.