ตัวอย่างเช่นฉันต้องการกรองตารางที่แสดงแถวซึ่งมีเฉพาะสตริง "USA" ในคอลัมน์ 3 และ 4
ตัวอย่างเช่นฉันต้องการกรองตารางที่แสดงแถวซึ่งมีเฉพาะสตริง "USA" ในคอลัมน์ 3 และ 4
คำตอบ:
คุณสามารถใช้โซลูชั่นมากมาย ฉันถือว่าคุณต้องการสร้างตารางใหม่โดยอิงจากตารางที่มีอยู่ สิ่งนี้เกี่ยวข้องกับฟังก์ชั่นบาเบลที่คุณกำหนดบล็อคโค้ดที่สร้างตารางใหม่ บล็อคโค้ดสามารถมีได้หลายภาษาและคุณยังสามารถกำหนดบล็อคโค้ดดังกล่าวที่จะใช้หลังจากนั้นตามปกติในสูตรตาราง
ฉันกำลังแสดงที่นี่เป็นเพียงตัวอย่างโดยใช้ 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 |
ตอนนี้เรากำหนดฟังก์ชันตัวกรองที่สร้างตารางใหม่ด้วยค่าที่ต้องการ
# + NAME: ตัวกรองของฉัน # + BEGIN_SRC elisp: var tbl = table1 val = "USA": colnames y (cl-loop สำหรับแถวใน tbl if (เท่ากับ (nth 3 แถว) val) รวบรวมแถวลงใน newtbl ในที่สุดก็กลับ newtbl) # + END_SRC # + ผลลัพธ์: ตัวกรองของฉัน | col1 | col2 | col3 | col4 | col5 | | ------ ------ + + + ------ ------ ------ + | | แถว 4 | 8 | JP | สหรัฐอเมริกา | 20 | | แถว 8 | 16 | PL | สหรัฐอเมริกา | 40 |
ฉันยังสามารถใช้ฟังก์ชันนี้กับไวยากรณ์ CALL ขององค์กรได้
# + CALL: my-filter (tbl = table1, val = "CN"): colnames y # + ผลการศึกษา: | col1 | col2 | col3 | col4 | col5 | | ------ ------ + + + ------ ------ ------ + | | แถว 1 | 2 | D | CN | 5 | | แถว 7 | 14 | D | CN | 35 |
ฉันยังแสดงให้เห็นถึงวิธีการ SQLite ที่ฉันใช้ความต้องการดั้งเดิมของคุณในการกรองแถวทั้งหมดที่มีสตริงทั้งในคอลัมน์ที่ 3 หรือ 4 ข้อเสียเปรียบเล็กน้อยของวิธีการ sqlite คือเรามีรหัสสำเร็จรูปเพื่ออ่านในตารางและสร้าง SQLite DB
# + NAME: my-filter2 # + BEGIN_SRC sqlite: db table1.sqlite: var tbl = table1 val = "USA": colnames ใช่ วางตารางหากมีอยู่ table1; สร้างตาราง table1 (col1 VARCHAR, col2 INTEGER, col3 VARCHAR, VARCHAR col4, col5 INTEGER); .import "$ tbl" table1 เลือก * จากตาราง 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"): colnames y # + ผลการศึกษา: | col1 | col2 | col3 | col4 | col5 | | ------ ------ + + + ------ ------ ------ + | | แถว 1 | 2 | D | CN | 5 | | แถว 3 | 6 | CN | D | 15 | | แถว 7 | 14 | D | CN | 35 | | แถว 9 | 18 | CN | D | 45 |
หวังว่าฉันเข้าใจคำถามของคุณถูกต้องและลิงก์ช่วยให้คุณค้นหาวิธีแก้ไขปัญหาอื่น ๆ
symbol-name
ฟังก์ชั่นเพื่อให้ประสบความสำเร็จในการแก้ปัญหา Emacs Lisp เพียงแค่พูดถึง
ฉันใช้q - Text as Dataและ 2 ฟังก์ชั่นในlibrary-of-babel
( Conf-ตัวอย่าง ) ของฉันเพื่อจัดเตรียมอินเทอร์เฟซsql ที่ง่ายในการสืบค้น / เข้าร่วมตาราง org-inline และ.*sv
ไฟล์ภายนอก
ภายใต้ประทุนq
(ผ่านหลาม ) ยังใช้SQLiteเช่นวิธีการที่สองจาก @dfeich แต่ขจัดความจำเป็นในการที่มีเสียงดังสำเร็จรูปรหัสที่เฉพาะเจาะจงกับตารางที่มาแต่ละ เพียงแค่ต้องติดตั้งครั้งเดียวผ่านตัวจัดการแพคเกจระบบโดยปกติpython-q-text-as-data
แล้ว
เมื่อโหลดไลบรารีของ babel ด้วยฟังก์ชัน 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