【问题标题】:ORACLE: need to export table data without spaces between columnsORACLE:需要导出表数据,列之间没有空格
【发布时间】:2013-06-16 21:11:39
【问题描述】:

假设我有带有列的表 A

      col1   col2   col3   col4
      -------------------
      sajal  singh  28     IND
      hello  how    are    you

我想将数据导出到一个平面文件中,列之间没有空格或制表符 所以输出应该是

      cat dump
      sajalsingh28IND
      hellohowareyou

我尝试过的。我写了一个脚本

      #!/usr/bin/bash

      #the file where sql output will go
      OUT=report.txt
      >$OUT
      DESC=desc.txt
      >$DESC

      sqlplus -s "xxx/xxx@xxx" << END_SQL > /dev/null

      set pages 0
      set feedback off
      set heading off
      set trimspool off
      set termout off
      set verify off
      set wrap off

      SPOOL $DESC

      Select * from table_name;

      SPOOL OFF

      END_SQL

但我在多行中得到一行的输出,并带有制表符/空格

  1. 所以问题是我该如何解决这个问题?和
  2. 我发现了一些数据泵实用程序,例如 expdp。我可以在 Unix 中使用它吗?如果是,我怎样才能实现这种格式的转储?

谢谢

【问题讨论】:

  • 也许这听起来很愚蠢,但我通常用记事本 ++ 解决这个问题,我用全部替换删除所有逗号和空格,它真的很好而且非常快。但是,也许你需要一些自动化的东西
  • 谢谢穆迪兹。但我必须将它用于多个表的生产:) 所以我猜记事本 ++ 不会为我工作。
  • 您确定不希望将值填充到列长度吗?我看不出你能用这个文件做什么 - 肯定不可能对内容进行解释吗?
  • Alex,填充到列长度的值也可以。

标签: oracle bash unix import export


【解决方案1】:

如果您已经有 CSV 转储,则可以运行以下命令:

awk 'BEGIN{FS=",";OFS=""}{$1=$1}1' csv.dump > new.dump 

未经测试:

SET HEADING OFF
SET FEEDBACK OFF
SPOOL $DESC

SELECT col1 ||''|| col2 ||''|| col3 FROM table_name;

SPOOL OFF;

【讨论】:

  • 没有。我没有csv。如果您看到开头的 cmets,我试图展示一个简化的 oracle 表。因为我不能在这里展示一个实际的。很抱歉造成混乱。我编辑了我的问题
  • @user2404176 不用担心。我已经为答案添加了更新。虽然没有测试。
【解决方案2】:

从“简化的 oracle 视图”到带有 的“普通”字符:

sed -n '3,$ s/\s//gp' file
$猫文件 col1 col2 col3 col4 ------------------ 萨哈尔·辛格 28 IND 你好吗 $sed -n '3,$ s/\s//gp' 文件 sajalsingh28IND 你好吗

说明:将第 3 行到 EOF 的所有空格(不是换行符)替换为“nothing”。

【讨论】:

  • OP 没有 CSV 转储。
  • 谢谢。我想我通过编写简化视图混淆了许多人。我在数据库中有一张桌子。我没有它在一个文件中。我为混乱道歉。我编辑了我的问题。请再看看。
【解决方案3】:

如果您想要填充列但在列之间没有额外的空格,您可以这样做:

set colsep ""

默认是在双引号之间有一个空格,这会在列之间放置一个空格。您可能还想这样做:

set tab off

... 以确保填充中的多个空格不会转换为制表符,这看起来很适合显示,但解析文件会很痛苦。

如果您根本不需要空格,要在 SQL*Plus 中执行此操作,您需要连接列:

 select col1 || col2 || col3 || col4 from table_name;

如果您在列之间放置分隔符(例如,将其设为 CSV),这很有用,但我不知道如果您将所有内容压缩在一起,您将能够对文件中的数据执行什么操作分隔符。

【讨论】:

  • 是的,我知道这听起来很疯狂。此数据将传递给不了解 delims 的大型机! :)
  • @user2404176 - 没有空格的固定宽度列听起来并不疯狂;没有分隔符的可变宽度(如在您的初始示例中)看起来是不可解析的。我想除非值中已经有标记。
  • 太棒了!这是有效的!只有一个问题。当我打开假脱机文件时,我看到一条记录在屏幕中途换行到下一行。知道如何解决这个问题吗?
  • 我同意 100%。不幸的是,我不能透露目的。但你是绝对正确的亚历克斯。
  • @user2404176 - set linesize 做一些大事。
【解决方案4】:

所以这就是我想出的:它将转储 oracle 数据,列之间没有任何空格等,同时保留数据中的空格。我以为我会和你分享。

#!/usr/bin/bash
#the file where sql output will go
OUT=report.txt
>$OUT
DESC=desc.txt
>$DESC

TABLE_NAME=$1


###GET DESCRIBE####

s=""
#######################
sqlplus -s "xxx/xxx@xxx" << END_SQL > /dev/null

set pages 0
set feedback off
set heading off
set trimspool off
set termout off
set verify off
set wrap off

SPOOL $DESC

desc $TABLE_NAME;

SPOOL OFF

END_SQL
#######################

for i in `cat $DESC|awk -F" " '{print $1}'|grep -v -i name|grep -v -`
do
s=$s"trim($i)||'|'||"
done

s=`echo $s|sed "s/||'|'||$//g"`
echo $s

#######################
#sqlplus - silent mode
#redirect /dev/null so that output is not shown on terminal
sqlplus -s "xxx/xxx@xxx" << END_SQL > /dev/null

set pages 0
set feedback off
set heading off
set trimspool off
set termout off
set verify off
set colsep ""
set tab off
set lines 1500

SPOOL $OUT

select $s from $TABLE_NAME;
SPOOL OFF

END_SQL
#######################


cat $OUT|sed "s/|//g"|sed "s/ *$//g" >$OUT.new
mv $OUT.new $OUT

echo Finished writing report $OUT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    相关资源
    最近更新 更多