当数据中有逗号(,)时,使用SQL加载程序从CSV文件(由逗号(,)分隔)中读取数据

时间:2018-11-15 10:20:11

标签: oracle oracle11g sql-loader

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

我的CSV文件数据用逗号(,)分隔:

EMPID,EMPNAME,SALARY,GRADE
123,Rams,1000,A1
124,Sand,"2,000",A2
125,Bhas,"3,00,000",A3

我的控制文件是:

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

当我使用上述控制文件加载数据时,第一条记录加载良好,而第二条记录则存在问题,因为薪金字段中存在逗号(薪水在多列中加载,因为存在逗号)。

在我的数据薪水字段中,尽管它带有逗号(,),但双引号引起来。 SQL * Loader应该将双引号之间的值视为一个字段,并且salary也应正确加载。

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

1 个答案:

答案 0 :(得分:0)

示例表:

SQL> create table test
  2    (empid   number,
  3     empname varchar2(20),
  4     salary  varchar2(20),
  5     grade   varchar2(2));

Table created.

SQL>

控制文件:

load data 
infile *
replace
into table test
fields terminated by ',' optionally enclosed by '"' trailing nullcols
( 
  empid,
  empname,
  salary,
  grade
)

begindata
123,Rams,1000,A1
124,Sand,"2,000",A2
125,Bhas,"3,00,000",A3

加载会话:

SQL> $sqlldr scott/tiger@xe control=test03.ctl log=test03.log

SQL*Loader: Release 11.2.0.2.0 - Production on ╚et Stu 15 22:27:27 2018

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>

结果:

SQL> select * From test;

     EMPID EMPNAME              SALARY               GR
---------- -------------------- -------------------- --
       123 Rams                 1000                 A1
       124 Sand                 2,000                A2
       125 Bhas                 3,00,000             A3

SQL>