मैं ऑर्गन मोड में टेबल को कैसे फ़िल्टर कर सकता हूं


11

उदाहरण के लिए, मैं तालिका को फ़िल्टर करना चाहता हूं जो इसे बनाता है पंक्ति को दिखाता है जिसमें केवल कॉलम 3 और 4 में "यूएसए" स्ट्रिंग है।

जवाबों:


19

आप समाधानों की एक भीड़ का उपयोग कर सकते हैं। मुझे लगता है कि आप एक मौजूदा के आधार पर एक नई तालिका तैयार करना चाहते हैं। इसमें बैबिल कार्यक्षमता शामिल है जहां आप नए टेबल का निर्माण करने वाले कोड ब्लॉक को परिभाषित करते हैं। कोड ब्लॉक कई भाषाओं में हो सकते हैं, और आप इस तरह के कोड ब्लॉक को सामान्य रूप से तालिका सूत्रों में बाद में उपयोग करने के लिए परिभाषित कर सकते हैं।

मैं यहाँ सिर्फ एक उदाहरण दिखा रहा हूँ जो emacs lisp का उपयोग कर रहा है। आप मेरे उदाहरण संग्रह में जीथब पर कई और उदाहरण पा सकते हैं: 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 तर्क।
  • मैं उसी मान को फ़िल्टर किए जाने को परिभाषित करता हूं : var असाइनमेंट को val = "USA" सेट करके
  • ध्यान दें कि मैं उपयोग कर रहा हूं : स्तंभ शीर्षों को संरक्षित करने के लिए BEGIN लाइन में कॉलनेम का तर्क।
  • मैं केवल इन उदाहरणों में कॉलम 4 को सरलता के लिए फ़िल्टर करता हूं। लेकिन इसका विस्तार करना तुच्छ है। यदि आप स्पष्ट समाधान चाहते हैं, तो बस पूछें।
  # NAME: मेरा फ़िल्टर
  # + BEGIN_SRC elisp: var tbl = table1 val = "USA": colnames y
    (tbl पंक्ति में पंक्ति के लिए-लूप
          अगर (बराबर 3 पंक्ति) वैल)
          newtbl में पंक्ति जमा करें
          अंत में newtbl लौटाएं)
  # + END_SRC

  # परिणाम: मेरा फ़िल्टर
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | पंक्ति 4 | 8 | जेपी | यूएसए | 20 |
  | पंक्ति 8 | 16 | पीएल | यूएसए | 40 |

मैं ऑर्ग-मोड कॉल सिंटैक्स के साथ भी इस फ़ंक्शन का उपयोग कर सकता हूं

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

  # + परिणाम:
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | पंक्ति 1 | 2 | डी | सीएन | 5 |
  | पंक्ति 7 | 14 | डी | सीएन | 35 |

मैं यहां SQLite दृष्टिकोण भी प्रदर्शित करता हूं, जहां मैं उन सभी पंक्तियों को फ़िल्टर करने की आपकी मूल आवश्यकता का उपयोग करता हूं, जिसमें या तो कॉलम 3 या 4 में स्ट्रिंग होती है। sqlite दृष्टिकोण का एक मामूली दोष यह है कि हमारे पास तालिका में पढ़ने और बनाने के लिए कुछ बॉयलरप्लेट कोड है एक SQLite डीबी।

  # + नाम: my-filter2
  # + BEGIN_SRC sqlite: db table1.sqlite: var tbl = table1 val = "USA": colnames yes
    ड्रॉप टेबल अगर मौजूद है टेबल 1;
    तालिका 1 बनाएँ (col1 VARCHAR, col2 INTEGER, col3 VARCHAR,)
    col4 VARCHAR, col5 INTEGER);
    .import "$ tbl" table1
    तालिका 1 से * का चयन करें जहां col3 = '$ val' या col4 = '$ val';
  # + END_SRC

  # + परिणाम:
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | पंक्ति 2 | 4 | यूएसए | पीएल | 10 |
  | पंक्ति 4 | 8 | जेपी | यूएसए | 20 |
  | row6 | 12 | यूएसए | जेपी | 30 |
  | पंक्ति 8 | 16 | पीएल | यूएसए | 40 |


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

  # + परिणाम:
  | col1 | col2 | col3 | col4 | col5 |
  | ------ + ------ + ------ + ------ + ------ |
  | पंक्ति 1 | 2 | डी | सीएन | 5 |
  | पंक्ति 3 | 6 | सीएन | डी | 15 |
  | पंक्ति 7 | 14 | डी | सीएन | 35 |
  | पंक्ति 9 | 18 | सीएन | डी | 45 |

आशा है कि मैंने आपके प्रश्न को सही ढंग से समझा और लिंक आपको समाधान के अन्य रूपों को खोजने में मदद करते हैं।


महान समाधान। Sqlite और gnuplot के साथ, एक ही स्रोत तालिका से कई भूखंडों को महान अर्थव्यवस्था के साथ उत्पन्न किया जा सकता है।
Emacs यूजर

महान समाधान के लिए धन्यवाद! BTW, मेरे वातावरण में, मुझे symbol-nameEmacs Lisp समाधान में सफल होने के लिए फ़ंक्शन को हटाना पड़ा । सिर्फ उल्लेख के लिए।
RUserPassingBy

धन्यवाद। मुझे केवल अब एहसास हुआ कि मैंने अपने मूल उदाहरण को प्रतीक के रूप में देश के नामों का उपयोग करके सीधे एक src ब्लॉक द्वारा निर्मित तालिका से तैयार किया था, इसलिए फ़िल्टर वास्तव में प्रतीक थे और तार नहीं। अब इसे सुधारा गया है।
डेविच

0

मैं q - पाठ को डेटा के रूप में उपयोग करता हूं , और ओआरजी-इनलाइन तालिकाओं और बाहरी फ़ाइलों को क्वेरी / शामिल करने के लिए एक आसान इंटरफ़ेस प्रदान करने के लिए मेरे library-of-babel( कंफर्ट-उदाहरण ) में 2 फ़ंक्शन करता हूं ।.*sv

हुड के अंतर्गत, q(के माध्यम से ) भी उपयोग करता है , @dfeich से दूसरा दृष्टिकोण की तरह है, लेकिन निकालता है प्रत्येक व्यक्ति के स्रोत तालिका में शोर बॉयलरप्लेट-कोड विशिष्ट की जरूरत है। यह सिर्फ सिस्टम पैकेज प्रबंधक के माध्यम से एक बार स्थापित करने की आवश्यकता है, आमतौर पर python-q-text-as-data

एक बार जब आपकी बाबुल की लाइब्रेरी को नीचे दिए गए 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.