oracle - मैं SQLPLUS का उपयोग कर एक CSV प्रारूपित फ़ाइल में कैसे स्पूल करूं?





(12)


मैं स्क्रिप्ट के लिए इस कमांड का उपयोग करता हूं जो आयामी तालिकाओं (डीडब्ल्यू) के लिए डेटा निकालता है। तो, मैं निम्नलिखित वाक्यविन्यास का उपयोग करता हूं:

set colsep '|'
set echo off
set feedback off
set linesize 1000
set pagesize 0
set sqlprompt ''
set trimspool on
set headsep off

spool output.dat

select '|', <table>.*, '|'
  from <table>
where <conditions>

spool off

और काम करता है। मैं आउटपुट फ़ाइल प्रारूप के लिए sed का उपयोग नहीं करते हैं।

मैं कुछ प्रश्नों को एक CSV आउटपुट प्रारूप में निकालना चाहता हूं। दुर्भाग्यवश, मैं इसे करने के लिए किसी भी फैंसी एसक्यूएल क्लाइंट या किसी भी भाषा का उपयोग नहीं कर सकता। मुझे SQLPLUS का उपयोग करना होगा।

मैं यह कैसे करुं?




आप पंक्तियों के साथ कुछ के साथ एक सीमित स्ट्रिंग का उत्पादन करने के लिए क्वेरी को स्पष्ट रूप से प्रारूपित कर सकते हैं:

select '"'||foo||'","'||bar||'"'
  from tab

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




आप निम्न का भी उपयोग कर सकते हैं, हालांकि यह फ़ील्ड के बीच रिक्त स्थान पेश करता है।

set colsep ,     -- separate columns with a comma
set pagesize 0   -- No header rows
set trimspool on -- remove trailing blanks
set headsep off  -- this may or may not be useful...depends on your headings.
set linesize X   -- X should be the sum of the column widths
set numw X       -- X should be the length you want for numbers (avoid scientific notation on IDs)

spool myfile.csv

select table_name, tablespace_name 
  from all_tables
 where owner = 'SYS'
   and tablespace_name is not null;

आउटपुट इस प्रकार होगा:

    TABLE_PRIVILEGE_MAP           ,SYSTEM                        
    SYSTEM_PRIVILEGE_MAP          ,SYSTEM                        
    STMT_AUDIT_OPTION_MAP         ,SYSTEM                        
    DUAL                          ,SYSTEM 
...

यह सभी क्षेत्रों को टाइप करने और उन्हें अल्पविरामों से जोड़कर बहुत कम कठिन होगा। यदि आप चाहें तो अल्पविराम से पहले दिखाई देने वाली सफेद जगह को हटाने के लिए आप एक साधारण सैड स्क्रिप्ट का पालन कर सकते हैं।

ऐसा कुछ काम कर सकता है ... (मेरे sed कौशल बहुत जंगली हैं, तो यह संभवतः काम की ज़रूरत होगी)

sed 's/\s+,/,/' myfile.csv 



मुझे पता है कि यह एक पुराना धागा है, हालांकि मैंने देखा कि किसी ने भी अंडरलाइन विकल्प का उल्लेख नहीं किया है, जो कॉलम शीर्षकों के तहत अंडरलाइन को हटा सकता है।

set pagesize 50000--50k is the max as of 12c
set linesize 10000   
set trimspool on  --remove trailing blankspaces
set underline off --remove the dashes/underlines under the col headers
set colsep ~

select * from DW_TMC_PROJECT_VW;



एसक्यूएल लिखने के लिए vi या vim का उपयोग करें, नियंत्रण-ए के साथ colsep का उपयोग करें (vi और vim में ctrl-a से ctrl-a के साथ)। लाइनिंग और पेजसाइज को कुछ तर्कसंगत बनाने के लिए सुनिश्चित करें और ट्रिमस्पूल और ट्रिमआउट चालू करें।

इसे एक फ़ाइल में स्पूल करें। फिर...

sed -e 's/,/;/g' -e 's/ *{ctrl-a} */,/g'  {spooled file}  > output.csv

उस sed चीज को एक स्क्रिप्ट में बदल दिया जा सकता है। Ctrl-a से पहले और बाद में "*" सभी बेकार रिक्त स्थान को निचोड़ता है। क्या यह बहुत अच्छा नहीं है कि वे एसक्यूप्लस से एचटीएमएल आउटपुट सक्षम करने के लिए परेशान हैं लेकिन देशी सीएसवी नहीं ?????

मैं इसे इस तरह से करता हूं क्योंकि यह डेटा में अल्पविराम को संभालता है। मैं उन्हें अर्ध-कॉलन में बदल देता हूं।




क्लाइंट टूल्स के नए संस्करणों के साथ, क्वेरी आउटपुट को प्रारूपित करने के लिए कई विकल्प हैं। शेष इसे किसी फ़ाइल में स्पूल करना या क्लाइंट टूल के आधार पर आउटपुट को फ़ाइल के रूप में सहेजना है। यहां कुछ तरीके दिए गए हैं:

  • एसक्यूएल * प्लस

एसक्यूएल * प्लस कमांड का उपयोग करके आप अपना वांछित आउटपुट प्राप्त करने के लिए प्रारूपित कर सकते हैं। आउटपुट को फ़ाइल में स्पूल करने के लिए SPOOL का उपयोग करें।

उदाहरण के लिए,

SQL> SET colsep ,
SQL> SET pagesize 20
SQL> SET trimspool ON
SQL> SET linesize 200
SQL> SELECT * FROM scott.emp;

     EMPNO,ENAME     ,JOB      ,       MGR,HIREDATE ,       SAL,      COMM,    DEPTNO
----------,----------,---------,----------,---------,----------,----------,----------
      7369,SMITH     ,CLERK    ,      7902,17-DEC-80,       800,          ,        20
      7499,ALLEN     ,SALESMAN ,      7698,20-FEB-81,      1600,       300,        30
      7521,WARD      ,SALESMAN ,      7698,22-FEB-81,      1250,       500,        30
      7566,JONES     ,MANAGER  ,      7839,02-APR-81,      2975,          ,        20
      7654,MARTIN    ,SALESMAN ,      7698,28-SEP-81,      1250,      1400,        30
      7698,BLAKE     ,MANAGER  ,      7839,01-MAY-81,      2850,          ,        30
      7782,CLARK     ,MANAGER  ,      7839,09-JUN-81,      2450,          ,        10
      7788,SCOTT     ,ANALYST  ,      7566,09-DEC-82,      3000,          ,        20
      7839,KING      ,PRESIDENT,          ,17-NOV-81,      5000,          ,        10
      7844,TURNER    ,SALESMAN ,      7698,08-SEP-81,      1500,          ,        30
      7876,ADAMS     ,CLERK    ,      7788,12-JAN-83,      1100,          ,        20
      7900,JAMES     ,CLERK    ,      7698,03-DEC-81,       950,          ,        30
      7902,FORD      ,ANALYST  ,      7566,03-DEC-81,      3000,          ,        20
      7934,MILLER    ,CLERK    ,      7782,23-JAN-82,      1300,          ,        10

14 rows selected.

SQL>
  • एसक्यूएल डेवलपर संस्करण पूर्व 4.1

वैकल्पिक रूप से, आप SQL डेवलपर में नए /*csv*/ संकेत का उपयोग कर सकते हैं।

/*csv*/

उदाहरण के लिए, मेरे एसक्यूएल डेवलपर संस्करण 3.2.20.10 में :

अब आप आउटपुट को फाइल में सहेज सकते हैं।

  • एसक्यूएल डेवलपर संस्करण 4.1

एसक्यूएल डेवलपर संस्करण 4.1 में नया, sqlplus कमांड की तरह निम्न का उपयोग करें और स्क्रिप्ट के रूप में चलाएं। क्वेरी में संकेत की कोई ज़रूरत नहीं है।

SET SQLFORMAT csv

अब आप आउटपुट को फाइल में सहेज सकते हैं।




यह कच्चा है, लेकिन:

set pagesize 0 linesize 500 trimspool on feedback off echo off

select '"' || empno || '","' || ename || '","' || deptno || '"' as text
from emp

spool emp.csv
/
spool off



मैंने एक बार एक छोटी एसक्यूएल * प्लस स्क्रिप्ट लिखी है जो एक csv (वास्तव में एक एसएसवी) बनाने के लिए dbms_sql और dbms_output का उपयोग करता है। आप इसे मेरे githup भंडार पर पा सकते हैं।




कॉल नाम को एक-एक करके संपादित करने के बजाय sqlplus प्रॉम्प्ट में "सेट colsep" का उपयोग करना पसंद करते हैं। आउटपुट फ़ाइल को संपादित करने के लिए sed का उपयोग करें।

set colsep '","'     -- separate columns with a comma
sed 's/^/"/;s/$/"/;s/\s *"/"/g;s/"\s */"/g' $outfile > $outfile.csv



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

set echo off
set heading off
set feedback off
set linesize 1024   -- or some other value, big enough
set pagesize 50000
set verify off
set trimspool on

spool output.csv
select trim(
       '"'   || replace(col1, '"', '""') || 
       '","' || replace(col2, '"', '""') ||
       '","' || replace(coln, '"', '""') || '"' ) -- etc. for all the columns
from   yourtable
/
spool off

या, यदि आप फ़ील्ड के लिए एकल उद्धरण चरित्र चाहते हैं:

set echo off
set heading off
set feedback off
set linesize 1024   -- or some other value, big enough
set pagesize 50000
set verify off
set trimspool on

spool output.csv
select trim(
'"'   || replace(col1, '''', '''''') || 
'","' || replace(col2, '''', '''''') ||
'","' || replace(coln, '''', '''''') || '"' ) -- etc. for all the columns
from   yourtable
/
spool off



यदि आप 12.2 का उपयोग कर रहे हैं, तो आप बस कह सकते हैं

set markup csv on



to_char() फ़ंक्शन फॉर्मेट संख्याओं के लिए है:

select to_char(column_1, 'fm000') as column_2
from some_table;

fm उपसर्ग ("भरण मोड") जिसके परिणामस्वरूप varchar में अग्रणी रिक्त स्थान से बचा जाता है। 000 बस आपके द्वारा इच्छित अंकों की संख्या को परिभाषित करता है।

psql (9.3.5)
Type "help" for help.

postgres=> with sample_numbers (nr) as (
postgres(>     values (1),(11),(100)
postgres(> )
postgres-> select to_char(nr, 'fm000')
postgres-> from sample_numbers;
 to_char
---------
 001
 011
 100
(3 rows)

postgres=>

प्रारूप चित्र पर अधिक जानकारी के लिए, कृपया मैनुअल देखें:
http://www.postgresql.org/docs/current/static/functions-formatting.html





sql oracle csv sqlplus