我想通过跳过最后一行(即拖车行)来导入数据库表中的CSV文件。 我使用oracle的外部表方式导入文件。据我所知,只有在外部表中跳过标题并导入的方法。但我想跳过预告片并导入。我该怎么办?
以下是我的代码:
CREATE OR REPLACE DIRECTORY ext_tab_data AS 'C:\Users\hello\Desktop\';
CREATE TABLE buildinfo_ext (
"BUILD NO" NUMBER NOT NULL ENABLE,
"DATE" DATE NOT NULL ENABLE
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY ext_tab_data
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
SKIP 1
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
(
"BUILD NO" NUMBER NOT NULL ENABLE,
"DATE" DATE NOT NULL ENABLE
)
)
LOCATION ('Info.csv')
)
PARALLEL 5
REJECT LIMIT UNLIMITED;
请帮助我。
提前致谢。
美好的一天!!!!
答案 0 :(得分:0)
这应该跳过第一行:
...
RECORDS DELIMITED BY NEWLINE
SKIP 1
FIELDS TERMINATED BY ','
...
另一种方法是添加一个字段来表示行号,然后在查询表时使用它;添加此字段应创建一个字段LINE_NUMBER
,其中包含文件中行的编号:
...
"DATE" DATE NOT NULL ENABLE,
LINE_NUMBER RECNUM
...
通过这种方式,您可以以相同的方式处理第一行和最后一行,只需检查行号。
答案 1 :(得分:0)
您可以尝试考虑一些过滤逻辑,如下所示。 PS这不是经过测试的代码。
CREATE TABLE buildinfo_ext (
"BUILD NO" NUMBER NOT NULL ENABLE,
"DATE" DATE NOT NULL ENABLE
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY ext_tab_data
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
(
"BUILD NO" NUMBER NOT NULL ENABLE,
"DATE" DATE NOT NULL ENABLE
)
REJECT ROWS WITH ALL NULL FIELDS ----You can try check if that records is null. Or some other logic,
(
"BUILD NO" NUMBER
TERMINATED BY "," OPTIONALLY ENCLOSED BY '"',
"DATE" DATE
)
)
LOCATION ('Info.csv')
)
PARALLEL 5
REJECT LIMIT UNLIMITED;
答案 2 :(得分:0)
让我们看一下场景,就像我们不知道数据,但现在我们想跳过最后一行
如果您对数据一无所知(例如,它在预告片的内置编号字段中没有神奇的数字,您可以查找;并且它不会成为无论如何都被拒绝了,因为它根本不是数字;等等)是the PREPROCESSOR
clause,让它调用一个脚本,为你删除文件的最后一行。
例如,如果我创建名为remove_last_line
的{{3}}(在同一目录中,但它可以 - 而且应该 - 在其他地方)只包含对sed
命令的调用(或GNU /usr/bin/head --lines=-1 $1
命令也适用于Linux):
#!/bin/bash
/bin/sed '$d' $1
然后我可以告诉Oracle我希望在加载文件之前传递该文件:
CREATE TABLE buildinfo_ext (
"BUILD NO" NUMBER,
"DATE" DATE
)
ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER
DEFAULT DIRECTORY ext_tab_data
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
SKIP 1
PREPROCESSOR 'remove_last_line'
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
(
"BUILD NO",
"DATE" CHAR(10) DATE_FORMAT DATE MASK "YYYY-MM-DD"
)
)
LOCATION ('Info.csv')
)
--PARALLEL 5
REJECT LIMIT UNLIMITED;
我已禁用PARRALEL
选项,因为它与SKIP
发生冲突,但您当然也可以让预处理程序删除标题。我也调整了其他一些内容。
然后我创建一个Info.csv
包含:
Build number,Date
1,2016-07-01
2,2016-07-02
2 records
当我查询表时,我只看到文件中的两个有效行:
select * from buildinfo_ext;
BUILD NO DATE
---------- ---------
1 01-JUL-16
2 02-JUL-16
未生成.bad
个文件,且.log
文件未报告任何问题:
LOG file opened at 08/09/16 15:56:14
KUP-05004: Warning: Intra source concurrency disabled because parallel select was not requested.
KUP-05007: Warning: Intra source concurrency disabled because the preprocessor option is being used.
Field Definitions for table BUILDINFO_EXT
Record format DELIMITED BY NEWLINE
Data in file has same endianness as the platform
Rows with all null fields are accepted
Fields in Data Source:
BUILD NO CHAR (255)
Terminated by ","
Trim whitespace same as SQL Loader
DATE CHAR (10)
Date datatype DATE, date mask YYYY-MM-DD
Terminated by ","
Trim whitespace same as SQL Loader
Date Cache Statistics for table BUILDINFO_EXT
Max Size: 1000
Entries : 2
Hits : 0
Misses : 0
从您在Windows上的目录路径,但您可以使用预处理器批处理脚本执行类似的操作。其他操作系统可能还需要不同的脚本才能达到同样的效果。