जवाबों:
आप समाधानों की एक भीड़ का उपयोग कर सकते हैं। मुझे लगता है कि आप एक मौजूदा के आधार पर एक नई तालिका तैयार करना चाहते हैं। इसमें बैबिल कार्यक्षमता शामिल है जहां आप नए टेबल का निर्माण करने वाले कोड ब्लॉक को परिभाषित करते हैं। कोड ब्लॉक कई भाषाओं में हो सकते हैं, और आप इस तरह के कोड ब्लॉक को सामान्य रूप से तालिका सूत्रों में बाद में उपयोग करने के लिए परिभाषित कर सकते हैं।
मैं यहाँ सिर्फ एक उदाहरण दिखा रहा हूँ जो 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 |
अब हम एक फिल्टर फ़ंक्शन को परिभाषित करते हैं जो आवश्यक मानों के साथ एक नई तालिका तैयार करता है।
# 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 |
आशा है कि मैंने आपके प्रश्न को सही ढंग से समझा और लिंक आपको समाधान के अन्य रूपों को खोजने में मदद करते हैं।
symbol-name
Emacs Lisp समाधान में सफल होने के लिए फ़ंक्शन को हटाना पड़ा । सिर्फ उल्लेख के लिए।
मैं q - पाठ को डेटा के रूप में उपयोग करता हूं , और ओआरजी-इनलाइन तालिकाओं और बाहरी फ़ाइलों को क्वेरी / शामिल करने के लिए एक आसान एसक्यूएल इंटरफ़ेस प्रदान करने के लिए मेरे library-of-babel
( कंफर्ट-उदाहरण ) में 2 फ़ंक्शन करता हूं ।.*sv
हुड के अंतर्गत, q
(के माध्यम से अजगर ) भी उपयोग करता है SQLite , @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