ฉันจะกรองตารางในโหมดองค์กรได้อย่างไร


11

ตัวอย่างเช่นฉันต้องการกรองตารางที่แสดงแถวซึ่งมีเฉพาะสตริง "USA" ในคอลัมน์ 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 assignment โดยset val = "USA"
  • โปรดสังเกตว่าฉันใช้อาร์กิวเมนต์: colnamesในบรรทัด BEGIN เพื่อรักษาส่วนหัวของคอลัมน์
  • ฉันกรองเฉพาะคอลัมน์ 4 ในตัวอย่างเหล่านี้เพื่อความเรียบง่าย แต่มันก็ไม่สำคัญที่จะยืดออก หากคุณต้องการคำตอบที่ชัดเจนเพียงแค่ถาม
  # + 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 |

หวังว่าฉันเข้าใจคำถามของคุณถูกต้องและลิงก์ช่วยให้คุณค้นหาวิธีแก้ไขปัญหาอื่น ๆ


ทางออกที่ดี ด้วย sqlite และ gnuplot สามารถแปลงหลาย ๆ ตารางจากแหล่งข้อมูลเดียวได้ด้วยเศรษฐกิจที่ยอดเยี่ยม
ผู้ใช้ Emacs

ขอบคุณสำหรับการแก้ปัญหาที่ยอดเยี่ยม! BTW ในสภาพแวดล้อมของฉันฉันต้องลบsymbol-nameฟังก์ชั่นเพื่อให้ประสบความสำเร็จในการแก้ปัญหา Emacs Lisp เพียงแค่พูดถึง
RUserPassing โดย

ขอบคุณ ฉันเพิ่งรู้ว่าตอนนี้ฉันได้เตรียมตัวอย่างดั้งเดิมของฉันจากตารางที่สร้างโดย src block โดยตรงโดยใช้ชื่อประเทศเป็นสัญลักษณ์ดังนั้นตัวกรองจึงเป็นสัญลักษณ์ที่ส่งมอบจริงไม่ใช่สตริง มันได้รับการแก้ไขแล้ว
dfeich

0

ฉันใช้q - Text as Dataและ 2 ฟังก์ชั่นในlibrary-of-babel( Conf-ตัวอย่าง ) ของฉันเพื่อจัดเตรียมอินเทอร์เฟซง่ายในการสืบค้น / เข้าร่วมตาราง org-inline และ.*svไฟล์ภายนอก

ภายใต้ประทุนq(ผ่าน ) ยังใช้เช่นวิธีการที่สองจาก @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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.