2013-07-31 95 views
6

Tôi bắt buộc phải tạo một csv từ một bảng trong Oracle, sử dụng sqlplus. Sau đây là định dạng yêu cầu:Định dạng tiêu đề trong khi cuộn một tệp csv trong sqlplus

"HOST_SITE_TX_ID","SITE_ID","SITETX_TX_ID","SITETX_HELP_ID" 
"664436565","16","2195301","0" 
"664700792","52","1099970","0" 

Sau đây là mảnh liên quan của shell script tôi đã viết:

sqlplus -s $sql_user/[email protected]$sid <<eof>> /dev/null 
    set feedback off 
    set term off 
    set linesize 1500 
    set pagesize 11000 
    --set colsep , 
    --set colsep '","' 
    set trimspool on 
    set underline off 
    set heading on 
    --set headsep $ 
    set newpage none 


    spool "$folder$filename$ext" 
    select '"'||PCL_CARRIER_NAME||'","'||SITETX_EQUIP_ID||'","'||SITETX_SITE_STAT||'","'||SITETX_CREATE_DATE||'","'||ADVTX_VEH_WT||'"' 
    from cvo_admin.MISSING_HOST_SITE_TX_IDS; 
    spool off 

(Tôi đã sử dụng một số báo cáo nhận xét trong, để biểu thị những điều mà tôi đã cố gắng nhưng couldn 't có được để làm việc)

Kết quả tôi nhận được là:

'"'||PCL_CARRIER_NAME||'","'||SITETX_EQUIP_ID||'","'||SITETX_SITE_STAT||'","'||SITETX_CREATE_DATE||'","'||ADVTX_VEH_WT||'"' 
"TRANSPORT INC","113","00000000","25-JAN-13 10.17.51 AM","" 
"TRANSPORT INC","1905","00000000","25-JAN-13 05.06.44 PM","0" 

Những show rằng tiêu đề là sai lầm - đó là nghĩa đen in toàn bộ chuỗi cần phải được hiểu là một câu lệnh sql, như trường hợp với dữ liệu được hiển thị.

Tùy chọn Tôi đang xem xét:

1) Sử dụng colsep

set colsep '","' 
spool 
select * from TABLE 
spool off 

này giới thiệu các vấn đề khác như các dữ liệu có khoảng trống ở đầu và đuôi, đầu tiên và giá trị cuối cùng trong tập tin được không dùng dấu nháy

HOST_SITE_TX_ID"," SITE_ID" 
    "    12345","  16" 
    "    12345","  21 

Tôi kết luận rằng phương pháp này khiến tôi bị ợ nóng nhiều hơn phương pháp tôi đã mô tả trước đó.

2) Tải tệp và sử dụng regex để sửa đổi tiêu đề.

3) Rời bỏ tiêu đề hoàn toàn và tự thêm một chuỗi tiêu đề ở đầu file, sử dụng một kịch bản

Lựa chọn 2 là doable hơn, nhưng tôi vẫn còn say sưa hỏi, nếu có thể có một tốt hơn cách để định dạng tiêu đề bằng cách nào đó, do đó, nó đi kèm với định dạng csv thông thường, (dấu phẩy phân tách kép, dấu ngoặc kép).

Tôi đang tìm cách làm ít mã hóa nhất có thể - bảng tôi xuất có khoảng 40 cột và tôi hiện đang chạy tập lệnh cho khoảng 4 triệu bản ghi - chia chúng thành một loạt khoảng 10 nghìn bản. Tôi thực sự đánh giá cao bất kỳ đề xuất nào, thậm chí hoàn toàn khác với cách tiếp cận của tôi - tôi là một lập trình viên trong học tập.

Trả lời

3

Đây là cách tôi đã tạo ra một tiêu đề:

set heading off 

/* header */ 
SELECT '"'||PCL_CARRIER_NAME||'","'||SITETX_EQUIP_ID||'","'||SITETX_SITE_STAT||'","'||SITETX_CREATE_DATE||'","'||ADVTX_VEH_WT||'"' 
FROM 
(
     SELECT 'PCL_CARRIER_NAME' AS PCL_CARRIER_NAME 
     ,  'SITETX_EQUIP_ID' AS SITETX_EQUIP_ID 
     ,  'SITETX_SITE_STAT' AS SITETX_SITE_STAT 
     ,  'SITETX_CREATE_DATE' AS SITETX_CREATE_DATE 
     ,  'ADVTX_VEH_WT'  AS ADVTX_VEH_WT 
     FROM DUAL 
) 
UNION ALL 
SELECT '"'||PCL_CARRIER_NAME||'","'||SITETX_EQUIP_ID||'","'||SITETX_SITE_STAT||'","'||SITETX_CREATE_DATE||'","'||ADVTX_VEH_WT||'"' 
FROM 
(
     /* first row */ 
     SELECT to_char(123)     AS PCL_CARRIER_NAME 
     ,  to_char(sysdate, 'yyyy-mm-dd') AS SITETX_EQUIP_ID 
     ,  'value3'      AS SITETX_SITE_STAT 
     ,  'value4'      AS SITETX_CREATE_DATE 
     ,  'value5'      AS ADVTX_VEH_WT 
     FROM DUAL 
     UNION ALL 
     /* second row */ 
     SELECT to_char(456)      AS PCL_CARRIER_NAME 
     ,  to_char(sysdate-1, 'yyyy-mm-dd') AS SITETX_EQUIP_ID 
     ,  'value3'       AS SITETX_SITE_STAT 
     ,  'value4'       AS SITETX_CREATE_DATE 
     ,  'value5'       AS ADVTX_VEH_WT 
     FROM DUAL 
) MISSING_HOST_SITE_TX_IDS; 
5

Một cách dễ dàng để có một csv chỉ với một tiêu đề là để làm

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

các embedded là một lựa chọn ẩn nhưng điều quan trọng là để có JUST một tiêu đề

+2

Tôi đang gặp khó khăn khi xem đây là câu trả lời cho câu hỏi được hỏi tại đây. –