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


143

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

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


कृपया, @busC द्वारा दिए गए उत्तर को सही मानें। यह फ़ाइल को प्रिंट करने के लिए स्पूल कमांड को याद कर रहा है लेकिन यह सीएसवी प्रारूप में डेटा निर्यात करने का सबसे सरल उपाय है।
रैलर

जवाबों:


28

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

set markup csv on
spool myfile.csv

क्या किसी को पता है कि आप इको को कैसे बंद करते हैं, स्पष्ट "सेट इको ऑफ़" इस के साथ काम नहीं करता है?
क्वाटर्नियन

यह मानते हुए कि ऐसा इसलिए है क्योंकि आप एक स्क्रिप्ट को निष्पादित कर रहे हैं और किसी फ़ाइल पर लिख रहे हैं, आपको बस "सेट आउट ऑफ" होना चाहिए
BobC

155

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

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 's/\s+,/,/' myfile.csv 

Te colsep लाइन में "," गायब है। इसके अलावा X को बंद और सुव्यवस्थित करना उपयोगी होने की संभावना है। उत्तर संपादित करें और मैं इसे स्वीकार करूंगा।
डैनियल सी। सोबराल

5
सेड कमांड है: cat myfile.csv | sed -e's / [\ t] * | / | / / g; s / | [] * / | / g '> myfile.csv वैसे भी, ओरेकल वास्तव में बेकार है।
स्टेन

2
और set pagesize 10000. के बजाय कॉलम नाम के साथ एक हेडर का उपयोग करने के लिए मेरी पिछली टिप्पणी में, आप एक ही फ़ाइल पर रीडायरेक्ट नहीं कर सकते हैं cat myfile.csv | sed -e 's/[ \t]*|/|/g ; s/|[ ]*/|/g' > my_other_file.csv:।
स्टेन

1
मैंने रिक्त स्थान और डैश को फ़िल्टर किया grepऔर trइस तरह से रेखांकित किया grep -v -- ----- myfile.csv | tr -d [:blank:] > myfile.csv
ixe013

1
@slayernoah स्पूल कमांड एक डायरेक्टरी पाथ और फ़ाइल नाम ले सकता है, ताकि आप यह निर्दिष्ट कर सकें कि आउटपुट फ़ाइल कहाँ रखी जाएगी। अन्यथा, यह उस स्थान पर निर्भर करेगा जहां आप स्क्रिप्ट निष्पादित कर रहे हैं।
गाबे

35

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

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 का उपयोग नहीं करता।


24

मैं एक ऐसी ही समस्या देख रहा हूं ...

मुझे SQLPLUS से CSV फ़ाइल को स्पूल करने की आवश्यकता है, लेकिन आउटपुट में 250 कॉलम हैं।

SQLPLUS आउटपुट स्वरूपण कष्टप्रद से बचने के लिए मैंने क्या किया:

set linesize 9999
set pagesize 50000
spool myfile.csv
select x
from
(
select col1||';'||col2||';'||col3||';'||col4||';'||col5||';'||col6||';'||col7||';'||col8||';'||col9||';'||col10||';'||col11||';'||col12||';'||col13||';'||col14||';'||col15||';'||col16||';'||col17||';'||col18||';'||col19||';'||col20||';'||col21||';'||col22||';'||col23||';'||col24||';'||col25||';'||col26||';'||col27||';'||col28||';'||col29||';'||col30 as x
from (  
      ...  here is the "core" select
     )
);
spool off

समस्या यह है कि आप स्तंभ शीर्षक नाम खो देंगे ...

आप इसे जोड़ सकते हैं:

set heading off
spool myfile.csv
select col1_name||';'||col2_name||';'||col3_name||';'||col4_name||';'||col5_name||';'||col6_name||';'||col7_name||';'||col8_name||';'||col9_name||';'||col10_name||';'||col11_name||';'||col12_name||';'||col13_name||';'||col14_name||';'||col15_name||';'||col16_name||';'||col17_name||';'||col18_name||';'||col19_name||';'||col20_name||';'||col21_name||';'||col22_name||';'||col23_name||';'||col24_name||';'||col25_name||';'||col26_name||';'||col27_name||';'||col28_name||';'||col29_name||';'||col30_name from dual;

select x
from
(
select col1||';'||col2||';'||col3||';'||col4||';'||col5||';'||col6||';'||col7||';'||col8||';'||col9||';'||col10||';'||col11||';'||col12||';'||col13||';'||col14||';'||col15||';'||col16||';'||col17||';'||col18||';'||col19||';'||col20||';'||col21||';'||col22||';'||col23||';'||col24||';'||col25||';'||col26||';'||col27||';'||col28||';'||col29||';'||col30 as x
from (  
      ...  here is the "core" select
     )
);
spool off

मुझे पता है कि यह कट्टर है, लेकिन यह मेरे लिए काम करता है ...


क्या हमें ||उपश्रेणी की भी आवश्यकता है ?, मुझे नहीं लगता कि यह उपश्रेणियों के लिए आवश्यक है। लेकिन हां यह प्राथमिक चयन के लिए आवश्यक है।
डेविडब

के लिए अतिरिक्त बाहरी क्या है select x? इसके बिना काम करना चाहिए। @davidb, आप सही कह रहे हैं कि प्राथमिक आंतरिक उपसमुच्चय में संघनन की आवश्यकता नहीं है, लेकिन सभी स्तंभों को col1, col2 ... आदि के रूप में उतारा जा रहा है। वहाँ आवश्यक है।
अमित नायडू Amit

18

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

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

SQL * प्लस कमांड का उपयोग करके आप अपना वांछित आउटपुट प्राप्त करने के लिए प्रारूपित कर सकते हैं। एक फ़ाइल में आउटपुट स्पूल करने के लिए 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>
  • SQL डेवलपर संस्करण पूर्व 4.1

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

/*csv*/

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

यहां छवि विवरण दर्ज करें

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

  • SQL डेवलपर संस्करण 4.1

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

SET SQLFORMAT csv

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


12

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

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;

अंडरलाइन विकल्प पर अच्छी पकड़, जरूरत है कि एक।
नॉकडाउन

यह अच्छा है अगर आप एक शीर्ष पंक्ति के साथ एक सीएसवी चाहते हैं जिसमें प्रत्येक कॉलम के लिए शीर्षक / शीर्षक शामिल हैं। यह किसी को भी मदद करेगा जो सीएसवी फ़ाइल देखना चाहते हैं, और यह पता लगा सकते हैं कि वे क्या देख रहे हैं, आदि ...
डॉक्टर

10

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

set pagesize 0 linesize 500 trimspool on feedback off echo off

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

spool emp.csv
/
spool off

7

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

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

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


4

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

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

3

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


2

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

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

trim()अनावश्यक है।
अमित नायडू

1

Sql लिखने के लिए vi या vim का उपयोग करें, एक नियंत्रण-A के साथ colsep का उपयोग करें (vi में और ctrl-A के साथ ctrl-A को पूर्ववर्ती करें)। सुनिश्चित करें कि लाइनों को सेट करें और कुछ तर्कसंगत के लिए पृष्ठांकित करें और ट्रिमस्पूल और ट्रिमआउट चालू करें।

इसे एक फ़ाइल में बंद करें। फिर...

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

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

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


3
यह "मुझे SQLPlus का उपयोग करना चाहिए" परीक्षण विफल रहता है।
डैनियल सी। सोबरल

0

Csv फ़ाइलों को बनाने के लिए sqlplus का उपयोग करने में समस्या है। यदि आप कॉलम हेडर केवल एक बार आउटपुट में चाहते हैं और हजारों या लाखों पंक्तियाँ हैं, तो आप एक बार दोहराने के लिए पर्याप्त पेजेज़ सेट नहीं कर सकते। इसका समाधान पेजेज़ = 50 से शुरू करना है और हेडर को पार्स करना है, फिर डेटा प्राप्त करने के लिए फिर से पेजेज़ = 0 के साथ चयन जारी करें। नीचे बैश स्क्रिप्ट देखें:

#!/bin/bash
FOLDER="csvdata_mydb"
CONN="192.168.100.11:1521/mydb0023.world"
CNT=0376
ORD="0376"
TABLE="MY_ATTACHMENTS"

sqlplus -L logn/pswd@//${CONN}<<EOF >/dev/null
set pagesize 50;
set verify off;
set feedback off;
set long 99999;
set linesize 32767;
set trimspool on;
col object_ddl format A32000;
set colsep ,;
set underline off;
set headsep off;
spool ${ORD}${TABLE}.tmp;
select * from tblspc.${TABLE} where rownum < 2;
EOF
LINES=`wc -l ${ORD}${TABLE}.tmp | cut -f1 -d" "`
[ ${LINES} -le 3 ] && {
  echo "No Data Found in ${TABLE}."
}
[ ${LINES} -gt 3 ] && {
  cat ${ORD}${TABLE}.tmp | sed -e 's/ * / /g' -e 's/^ //' -e 's/ ,/,/g' -e 's/, /,/g' | tail -n +3 | head -n 1 > ./${ORD}${TABLE}.headers
}

sqlplus -L logn/pswd@//${CONN}<<EOF >/dev/null
set pagesize 0;
set verify off;
set feedback off;
set long 99999;
set linesize 32767;
set trimspool on;
col object_ddl format A32000;
set colsep ,;
set underline off;
set headsep off;
spool ${ORD}${TABLE}.tmp;
select * from tblspc.${TABLE};
EOF
LINES=`wc -l ${ORD}${TABLE}.tmp | cut -f1 -d" "`
[ ${LINES} -le 3 ] && {
  echo "No Data Found in ${TABLE}."
}
[ ${LINES} -gt 3 ] && {
  cat ${ORD}${TABLE}.headers > ${FOLDER}/${ORD}${TABLE}.csv
  cat ${ORD}${TABLE}.tmp | sed -e 's/ * / /g' -e 's/^ //' -e 's/ ,/,/g' -e 's/, /,/g' | tail -n +2 | head -n -1 >> ${FOLDER}/${ORD}${TABLE}.csv
}

0

मैंने इस विशुद्ध रूप से SQLPlus स्क्रिप्ट को 1994 में CSV को टेबल डंप करने के लिए लिखा था।

जैसा कि स्क्रिप्ट टिप्पणियों में बताया गया है, ओरेकल में किसी ने मेरी स्क्रिप्ट को ओरेकल सपोर्ट नोट में रखा, लेकिन बिना किसी अटेंशन के।

https://github.com/jkstill/oracle-script-lib/blob/master/sql/dump.sql

स्क्रिप्ट भी एक नियंत्रण फ़ाइल और SQL * लोडर के लिए एक पैरामीटर फ़ाइल बनाता है



-3

आप सीएसवी संकेत का उपयोग कर सकते हैं। निम्नलिखित उदाहरण देखें:

select /*csv*/ table_name, tablespace_name
from all_tables
where owner = 'SYS'
and tablespace_name is not null;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.