Câu trả lời:
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.
# + 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.
symbol-name
chức năng để thành công trong giải pháp Emacs Lisp. Chỉ cần đề cập đến.
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 sql dễ dàng để truy vấn / tham gia các bảng org-inline và các .*sv
tệp bên ngoài .
Dưới mui xe, q
(thông qua python ) cũng sử dụng sqlite , 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