【问题标题】:Oracle PL-SQL : Import multiple delimited files into tableOracle PL-SQL:将多个分隔文件导入表中
【发布时间】:2023-04-11 04:33:01
【问题描述】:

我有多个文件(f1.log、f2.log、f3.log 等) 每个文件都有; & = 分隔格式的数据。 (新行由; 分隔,字段由= 分隔)例如

f1的数据:

1=a;2=b;3=c

f2的数据:

1=p;2=q;3=r

我需要读取所有这些文件并将数据导入表格格式:

filename  number  data

f1        1       a

f1        2       b

f1        3       c

f2        1       p
[...]

我是 SQL 新手。你能指导我吗,怎么做?

【问题讨论】:

  • 您可能正在寻找 sqlldr 控制文件语法?

标签: sql oracle parsing plsql delimited


【解决方案1】:

使用SQL*Loader 将文件放入表中。假设您创建了一个类似于以下内容的表:

create table FLOG
(
  FILENAME   varchar2(1000)
 ,NUM        varchar2(1000)
 ,DATA       varchar2(1000)
);

那么就可以使用下面的控制文件了:

LOAD DATA
INFILE 'f1.log' "str ';'"
truncate INTO TABLE flog
fields terminated by '=' TRAILING NULLCOLS
(
   filename constant 'f1'
   ,num  char 
   ,data char 
)

但是,您需要为每个文件使用不同的控制文件。这可以通过使用 shell 脚本动态地制作控制文件来完成。示例 shell 脚本可以是:

cat >flog.ctl <<_EOF
LOAD DATA
INFILE '$1.log' "str ';'"
APPEND INTO TABLE flog
fields terminated by '=' TRAILING NULLCOLS
(
filename constant '$1'
,num  char
,data char
)
_EOF

sqlldr <username>/<password>@<instance> control=flog.ctl data=$1.log

保存为flog.sh,然后可以像这样运行:

./flog.sh f1
./flog.sh f2

【讨论】:

  • 亲爱的约翰,非常感谢您的回答。我有几个疑问:1)在INFILE之后放置““str';'”的目的是什么?2)我不能使用shell脚本,因为我这里只有窗口。如何为每个生成动态控制文件和我正在解析的每个数据文件?我想在过程中假脱机文件。但这是不可能的,因为假脱机不能在过程中完成。3)如果在执行 sqlldr 时,我们使用 'data=' 选项,我们是否必须在 ctl 文件中使用 INFILE 子句?据我了解,它们都具有相同的目的。
  • "str ';'" 表示; 是记录分隔符,而不是换行符(str 代表stream)。 INFILE 行仍然需要,因为尽管文件名部分现在是多余的,因为data= 命令行选项将始终覆盖那里的内容。但是文件名仍然需要放在INFILE 之后——尽管你可以使用任何名称。我对 Windows 批处理文件不太熟悉,所以我问了另一个问题 here 看看我的脚本是否可以转换。
  • 亲爱的约翰, 非常感谢您的热心帮助。其实我的要求有点不同。我有 blob 数据,其格式为文件 f1、f2,如上所述。我的代码看起来像:for loop -- procedure called below, generates text files f1.log, f2.log&lt;br/&gt; proc_to_read_blob(filename) /*code which loads data in files f1.log, f2.log into DB table*/ proc_to_pars_files(filename) end for loop 我不希望使用批处理或 shell 脚本,因为我希望使此代码适用于不同的操作系统。不太确定如何在这种情况下使用 sqlldr :(
  • 我为不正确的格式道歉。我可能多次尝试纠正它,但它似乎无法在我的本地计算机上运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 2011-09-01
  • 2018-05-26
相关资源
最近更新 更多