এসকিউএলপিএলএস ব্যবহার করে আমি কীভাবে কোনও সিএসভি ফর্ম্যাট করা ফাইলটিতে স্পুল করব?


143

আমি একটি সিএসভি আউটপুট ফর্ম্যাটে কিছু প্রশ্নগুলি বের করতে চাই। দুর্ভাগ্যক্রমে, আমি এটির জন্য কোনও অভিনব এসকিউএল ক্লায়েন্ট বা কোনও ভাষা ব্যবহার করতে পারি না। আমার অবশ্যই এসকিউএলপিএলএস ব্যবহার করা উচিত।

আমি এটা কিভাবে করব?


দয়া করে @ObC দ্বারা প্রদত্ত উত্তরটিকে সঠিক হিসাবে চিহ্নিত করুন। ফাইলটি মুদ্রণের জন্য এটি স্পুল কমান্ডটি হারিয়েছে তবে এটি সিএসভি ফর্ম্যাটে ডেটা রফতানির সহজ সমাধান।
rlar

উত্তর:


28

আপনি যদি 12.2 ব্যবহার করেন, আপনি কেবল বলতে পারেন

set markup csv on
spool myfile.csv

কেউ কীভাবে আপনার প্রতিধ্বনি বন্ধ করবেন তা জানেন, স্পষ্টত "সেট প্রতিধ্বনি" এইটির সাথে কাজ করবে বলে মনে হচ্ছে না?
কোয়ার্টেরিয়ন

ধরে নেওয়া যায় যে এটি কারণ আপনি কোনও স্ক্রিপ্ট সম্পাদন করছেন এবং একটি ফাইল লিখছেন, আপনার কেবল "টার্মআউট সেট আপ" করা উচিত
ববসি

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 

"," টি কলসেপ লাইনে অনুপস্থিত। এছাড়াও হেডসেসপ বন্ধ এবং লাইনসাইজ এক্স কার্যকর হওয়ার সম্ভাবনা রয়েছে। উত্তরটি সম্পাদনা করুন এবং আমি এটি গ্রহণ করব।
ড্যানিয়েল সি সোব্রাল

5
সেড কমান্ডটি হ'ল: cat myfile.csv | sed -e 's / [\ t] * | / | / g; এস / | [] * / </ g '> মাইফাইল.সি.ভি. যাইহোক, ওরাকল সত্যিই চুষছে।
স্টান

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
@ স্লেয়ারনোহ স্পুল কমান্ড একটি ডিরেক্টরি পাথ এবং ফাইলের নাম নিতে পারে, যাতে আপনি আউটপুট ফাইলটি কোথায় স্থাপন করবেন তা সঠিকভাবে নির্দিষ্ট করতে পারেন। অন্যথায়, এটি যেখানে আপনি স্ক্রিপ্টটি চালাচ্ছেন সেখানে তার উপর নির্ভর করবে।
গাবে

35

আমি এই কমান্ডটি স্ক্রিপ্টগুলির জন্য ব্যবহার করি যা ডাইমেনশনাল টেবিলগুলির জন্য ডেটা বের করে (ডিডাব্লু)। সুতরাং, আমি নিম্নলিখিত বাক্য গঠন ব্যবহার করেছি:

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

এবং কাজ করে। আউটপুট ফাইলের ফর্ম্যাট করার জন্য আমি সেড ব্যবহার করি না।


24

আমি একটি একই সমস্যা দেখতে পাচ্ছি ...

এসকিউএলপিএলএস থেকে আমার সিএসভি ফাইলটি স্পুল করতে হবে তবে আউটপুটটিতে 250 টি কলাম রয়েছে।

বিরক্তিকর এসকিউএলপিএলএস আউটপুট ফর্ম্যাটিং এড়াতে আমি কী করেছি:

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জন্য? এটি ছাড়া এটি কাজ করা উচিত। @ ডেভিডব, আপনি ঠিক বলেছেন যে প্রাথমিক অভ্যন্তরীণ সাবকোয়রিতে কনকেন্টেশন প্রয়োজন হয় না, তবে সমস্ত কলামগুলি কল 1, কোল 2 ... ইত্যাদি হিসাবে আলাদা করে রাখা হয়। সেখানে প্রয়োজন।
অমিত নাইডু

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>
  • এসকিউএল বিকাশকারী সংস্করণ 4.1 পূর্ববর্তী

অন্যথা, আপনি নতুন ব্যবহার করতে পারে ইঙ্গিতটি মধ্যে SQL বিকাশকারী/*csv*/

/*csv*/

উদাহরণস্বরূপ, আমার এসকিউএল বিকাশকারী সংস্করণে 3.2.20.10 :

এখানে চিত্র বর্ণনা লিখুন

এখন আপনি একটি ফাইলের মধ্যে আউটপুট সংরক্ষণ করতে পারে।

  • এসকিউএল বিকাশকারী সংস্করণ 4.1

এসকিউএল বিকাশকারী সংস্করণ ৪.১ এ নতুন, নিম্নলিখিত স্কেলপ্লাস কমান্ডের মতো ব্যবহার করুন এবং স্ক্রিপ্ট হিসাবে চালান। কোয়েরিতে কোনও ইঙ্গিতের দরকার নেই।

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;

আন্ডারলাইন বিকল্পটিতে দুর্দান্ত ধরা, এটির দরকার needed
নক করুন

আপনি যদি প্রতিটি কলামের শিরোনাম / শিরোনাম সমেত একটি শীর্ষ সারির সিএসভি চান তবে এটি দুর্দান্ত nice এটা কি তারা এ খুঁজছেন ইত্যাদি ... বাইরে যারা CSV ফাইল দেখতে চাইতে পারেন, এবং চিত্র সাহায্য করবে
ডক


7

আপনি লাইন দিয়ে কিছু দিয়ে একটি সীমিত স্ট্রিং উত্পাদন স্পষ্টভাবে ক্যোয়ারী ফর্ম্যাট করতে পারেন:

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

এবং উপযুক্ত হিসাবে আউটপুট বিকল্প সেট আপ করুন। একটি বিকল্প হিসাবে, এসকিউএলপ্লাসের COLSEP ভেরিয়েবল আপনাকে স্পষ্টতই একসাথে ক্ষেত্রগুলির সাথে স্ট্রিং উত্পন্ন করে স্ট্রিং উত্পন্ন না করেই সীমিত ফাইলগুলি তৈরি করতে দেয়। তবে আপনাকে যে কোনও কলামগুলিতে এম্বেড থাকা কমা অক্ষর থাকতে পারে তার জন্য স্ট্রিংগুলির চারপাশে উদ্ধৃতি দিতে হবে put


4

একের পর এক কর্ন নাম সম্পাদনা করার পরিবর্তে স্কুপ্লাস প্রম্পটে "সেট কলস্যাপ" ব্যবহার করতে পছন্দ করুন। আউটপুট ফাইল সম্পাদনা করতে সেড ব্যবহার করুন।

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

আপনার সচেতন হওয়া উচিত ক্ষেত্রের মানগুলিতে কমা এবং উদ্ধৃতি অক্ষর থাকতে পারে, তাই কিছু প্রস্তাবিত উত্তর কাজ করবে না, কারণ সিএসভি আউটপুট ফাইলটি সঠিক হবে না। কোনও ক্ষেত্রের উদ্ধৃতি অক্ষরগুলি প্রতিস্থাপন করতে এবং ডাবল উদ্ধৃতি অক্ষরের সাথে এটি প্রতিস্থাপন করতে, আপনি একটি একক উদ্ধৃতিটিকে ডাবল উদ্ধৃতিতে পরিবর্তন করতে, ওরায়েল সরবরাহ করে এমন 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

এসকিউএল লিখতে vi বা vim ব্যবহার করুন, একটি কন্ট্রোল-এ দিয়ে কলসপ ব্যবহার করুন (vi তে এবং vim একটি ctrl-A এর আগে একটি ctrl-v সহ)। লাইনসাইজ এবং পেজাইজাইজকে যুক্তিযুক্ত কিছুতে সেট করা এবং ট্রিমসপুল এবং ট্রিমআউট চালু করতে ভুলবেন না।

এটি একটি ফাইল বন্ধ spool। তারপর ...

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

এই সেড জিনিসটিকে স্ক্রিপ্টে পরিণত করা যেতে পারে। "*" সিআরটিএল-এর আগে এবং পরে সমস্ত অকেজো স্থানগুলি আটকায়। তারা কি স্ক্যালপ্লাস থেকে এইচটিএমএল আউটপুট সক্ষম করার জন্য স্থানীয় নেভিগেশন সিএসভি নয়, তা বিরক্ত করেছিল তা দুর্দান্ত নয় কি ?????

আমি এটি এইভাবে করি কারণ এটি ডেটাতে কমা পরিচালনা করে। আমি সেমি-কলোনগুলিতে পরিণত করি।


3
এটি "আমাকে অবশ্যই এসকিউএলপ্লাস ব্যবহার করতে হবে" পরীক্ষাটি ব্যর্থ করে।
ড্যানিয়েল সি

0

সিএসভি ফাইল তৈরি করতে স্কেলপ্লাস ব্যবহার করে একটি সমস্যা আছে। আপনি যদি আউটপুটে কেবল একবার কলাম শিরোনাম চান এবং কয়েক হাজার বা কয়েক মিলিয়ন সারি থাকে তবে আপনি পুনরাবৃত্তি না পাওয়ার জন্য পৃষ্ঠার আকারটিকে বড় আকারে সেট করতে পারবেন না। সমাধানটি হ'ল পেজ সাইজ = 50 দিয়ে শুরু করা এবং শিরোনামগুলি পার্স করা, তারপরে ডেটা পেতে পৃষ্ঠার আকার = 0 দিয়ে আবার নির্বাচন করুন issue নীচে বাশ স্ক্রিপ্ট দেখুন:

#!/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

1994 সালে সিএসভিতে টেবিল ডাম্প করার জন্য আমি এই খাঁটি এসকিউএলপ্লাস স্ক্রিপ্টটি লিখেছিলাম।

স্ক্রিপ্টের মন্তব্যে উল্লিখিত হিসাবে, ওরাকল-এ থাকা কেউ আমার স্ক্রিপ্টটিকে একটি ওরাকল সাপোর্ট নোটে রেখেছিলেন, তবে কোনও কারণ ছাড়াই।

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

স্ক্রিপ্ট এছাড়াও এসকিউএল * লোডার জন্য একটি নিয়ন্ত্রণ ফাইল এবং একটি পরামিতি ফাইল তৈরি করে



-3

আপনি সিএসভি ইঙ্গিতটি ব্যবহার করতে পারেন। নিম্নলিখিত উদাহরণটি দেখুন:

select /*csv*/ table_name, tablespace_name
from all_tables
where owner = 'SYS'
and tablespace_name is not null;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.