2013-07-31 7 views
6

Мне нужно, чтобы spool csv из таблицы в Oracle, используя sqlplus. Ниже формат требуется:Форматирование заголовка при буферизации csv-файла в sqlplus

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

Ниже приводится соответствующая часть сценария оболочки я писал:

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 

(я использовал некоторые комментировали заявления в, чтобы показать то, что я пытался, но не мог «т получить работу)

выход я получаю это:

'"'||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" 

который показывает что заголовок перепутан - он буквально печатает всю строку, которая должна была интерпретироваться как оператор sql, как в случае с отображаемыми данными.

Опции Я рассматривающие:

1) Использование colsep

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

Это вводит другие проблемы, как данные, имеющие начальные и конечные пробелы, первые и последние значения в файлах не заключаются в кавычки

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

Я пришел к выводу, что этот метод дает мне больше изжоги, чем тот, который я описал ранее.

2) Получение файла и использование регулярного выражения для изменения заголовка.

3) Оставив заголовок полностью вручную, добавив строку заголовка в начале файла, используя скрипт

Вариант 2 является более выполнимым, но я все еще был заинтересован в выяснении, если там может быть лучше способ форматировать заголовок каким-то образом, поэтому он входит в обычный формат csv, (с разделителями-запятыми, с двойной кавычкой).

Я стараюсь сделать как можно меньше жесткого кодирования - таблица, которую я экспортирую, содержит около 40 столбцов, и в настоящее время я запускаю скрипт для около 4 миллионов записей - разбивая их на партию по 10K каждый. Я был бы очень признателен за любые предложения, даже совершенно отличные от моего подхода - я программист в обучении.

ответ

3

Это, как я создал заголовок:

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

Один простой способ иметь CSV с только один заголовок сделать

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

embedded скрытый вариант, но это важно чтобы иметь ТОЛЬКО один заголовок

+2

Мне очень трудно увидеть, как это ответ на заданный здесь вопрос. –