当数据以双引号出现时,使用SQL loader将CSV文件(由管道“|”分隔的数据)加载到表中

问题描述 投票:0回答:1

我正在使用SQL * Loader将CSV文件数据加载到名为EMPLOYEE的表中。

我的CSV文件数据由管道(|)分隔:

EMPID|EMPNAME_ADDRESS|SALARY|GRADE
123|Rams Hyd|1000|A1
124|Sand MUM|2,000|A2
125|"PRASANNA qwer trasf\"501 advv vvd, qee ggg\trfe        \411005       THE|3,00,000|A3

我的控制文件是:

LOAD DATA
Insert INTO TABLE EMPLOYEE
Fields terminated by "|" Optionally enclosed by '"' TRAILING NULLCOLS
(
   EMPID,
   EMPNAME,
   SALARY,
   GRADE
)

当我使用上面的控制文件加载数据时,前两个记录正在加载正常,对于第三个记录我收到错误,如下所述。

no terminator found after TERMINATED and ENCLOSED field

请建议您进行更改以正确加载数据。

oracle oracle11g sql-loader
1个回答
0
投票

这是加载此类数据的一种方法。

首先,目标表(我希望它有意义;你应该提供它):

SQL> create table employee
  2  (empid   number,
  3   empname varchar2(200),
  4   salary  number,
  5   grade   varchar2(10)
  6  );

Table created.

SQL>

控制文件:注意SKIP选项(跳过标题行),以及SALARY列的REPLACE函数调用(删除多余的逗号,这些逗号是格式化的东西;稍后在表示层中添加它们)。

options (skip = 1)
load data 
infile *
replace
into table employee
fields terminated by "|" TRAILING NULLCOLS 
(
empid,
empname,
salary "replace(:salary, ',', null)",
grade)

begindata
EMPID|EMPNAME_ADDRESS|SALARY|GRADE
123|Rams Hyd|1000|A1
124|Sand MUM|2,000|A2
125|"PRASANNA qwer trasf\"501 advv vvd, qee ggg\trfe        \411005       THE|3,00,000|A3

加载会话:

SQL> $sqlldr scott/tiger control=test06.ctl log=test06.log

SQL*Loader: Release 11.2.0.2.0 - Production on Uto Tra 9 19:37:46 2019

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Commit point reached - logical record count 2
Commit point reached - logical record count 3

SQL> select * From employee;

     EMPID EMPNAME                                      SALARY GRADE
---------- ---------------------------------------- ---------- ----------
       123 Rams Hyd                                       1000 A1
       124 Sand MUM                                       2000 A2
       125 "PRASANNA qwer trasf\"501 advv vvd, qee      300000 A3
           ggg\trfe        \411005       THE


SQL>
© www.soinside.com 2019 - 2024. All rights reserved.