在Oracle中使用SQL LOADER导入CSV文件

时间:2012-05-31 19:15:19

标签: sql csv database-design oracle11g database-connection

我对数据库和编程很陌生。我对电脑术语不是很了解所以坚持下去。我有一个csv文件,我正在尝试加载到我的Oracle数据库中。它包含帐户信息,如姓名,电话号码,服务日期等。我已安装Oracle 11g Release 2。这就是我到目前为止所做的一步一步......

1)Ran SQL Loader

我创建了一个包含我需要的列的新表。例如

create table Billing ( TAP_ID char(10), ACCT_NUM char(10), MR_ID char(10), HOUSE_NUM char(10), STREET char(30), NAME char(50)

2)它促使我创建了表。接下来,我为记事本中的数据创建了一个控制文件,该文件与我的Billing表位于同一目录中,并具有.ctl扩展名。 GIS.csv是我从中获取数据的文件,也在同一目录中,并将其命名为Billing.ctl,看起来像这样。

load data
infile GIS.csv
into table Billing
fields terminated by ','
(TAP_ID, ACCT_NUM, MR_ID, HOUSE_NUM, STREET, NAME)

3)从命令行运行sqlldr以使用控制文件

sqlldr myusername/mypassword  Billing.ctl

这是我被困的地方。我看过我正在做的视频教程,但是我收到了这个错误:

SQL*Loader-522: lfiopn failed for file (Billing.log)

关于我在这里做错了什么的任何想法?

更新

我只是将文件移动到一个单独的目录中,我想我已经超过了之前的错误。 顺便说一句,是的Billing.ctl和GIS.csv在同一目录中。

但现在又出现了另一个错误:

'SQL*Loader-350: Syntax error at line 1.

期待关键字LOAD,找到“SERV TAP ID”。 “SERV TAP ID”,“ACCT NUMBER”,“MTR ID”,“SERV HOUSE”,“SERV STREET”,“SERV   ^'

我不明白为什么会出现这个错误。我的billing.ctl有一个负载。

LOAD data
infile GIS.csv
into table Billing
fields terminated by ','
(TAP_ID, ACCT_NUM, MTR_ID, SERV_HOUSE, SERV_STREET, SERV_TOWN, BIL_NAME, MTR_DATE_SET, BIL_PHONE, MTR_SIZE, BILL_CYCLE, MTR_RMT_ID)

有什么想法吗?

8 个答案:

答案 0 :(得分:4)

Sqlldr想要在控制文件所在的同一目录中写入日志文件。但显然它不能。它可能没有所需的权限。

如果您使用的是Linux或Unix,请尝试以与运行sqldr相同的方式运行以下命令:

touch Billing.log

它将显示您是否拥有权限。

<强>更新

正确的命令行是:

sqlldr myusername/mypassword control=Billing.ctl

答案 1 :(得分:2)

我需要一个名为FAR_T_SNSA.csv的csv文件,我想直接在oracle数据库中导入。为此我已经完成了以下步骤,它的工作非常好。以下是您要遵循的步骤:

如何在ORACLE数据库中导入CSV文件?

  1. 获取要在oracle数据库中导入的.csv格式文件。这里名为“FAR_T_SNSA.csv”
  2. 在sql中创建一个表,其列名与.csv文件中的列名相同。 create table Billing(iocl_id char(10),iocl_consumer_id char(10));

  3. 创建一个包含sql * loder脚本的控制文件。 在记事本中键入如下脚本,并使用.ctl扩展名保存此选项,将文件类型选为All Types(*)。这里控制文件被命名为Billing。脚本如下:

    LOAD DATA
    INFILE 'D:FAR_T_SNSA.csv'
    INSERT INTO TABLE Billing
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    TRAILING NULLCOLS
    (
    iocl_id,
    iocl_consumer_id
    )
    
  4. 现在在命令提示符下运行命令:

    Sqlldr UserId/Password
    Control = “ControlFileName” 
    --------------------------------
    Here ControlFileName is Billing.
    

答案 2 :(得分:1)

调用sql loader时需要指定日志文件名。

sqlldr myusername/mypassword control=Billing.ctl log=Billing.log

当我从python中调用sql loader时,我遇到了这个问题。以下文章捕获了在调用sql loader http://docs.oracle.com/cd/A97630_01/server.920/a96652/ch04.htm

时可以指定的所有参数

答案 3 :(得分:1)

试试这个

加载数据infile&#39;数据文件位置&#39;表格schema.tablename字段由&#39;,&#39;终止可选地包含在&#39; |&#39; (FIELD1,FIELD2,字段3 ....)

在命令提示符中:

sqlldr system@databasename/password control='control file location'

答案 4 :(得分:0)

“第1行” - 也许关于Windows vs unix换行符的内容? (正如我看到上面提到的Windows 7)。

答案 5 :(得分:0)

如果您的文字是: 乔说,“弗雷德在这里与他的”妻子“”。
它以CSV格式保存为:
“乔说,”“弗雷德在这里与他的”妻子“”“”。“
(规则是双引号围绕整个字段,双引号转换为两个双引号)。因此需要一个简单的Optional Enclosed By子句,但这还不够。由于这个规则,CSV很难实现。有时您可以在加载器中为该字段使用Replace子句,但根据您的数据,这可能还不够。通常需要预处理CSV才能在Oracle中加载。或者将其保存为XLS并使用Oracle SQL Developer应用程序导入到表中 - 非常适合一次性工作,不太适合编写脚本。

答案 6 :(得分:0)

负载数据  INFILE'D:\ CertificationInputFile.csv'  INTO TABLE CERT_EXCLUSION_LIST  字段被“|”终止选择性地封闭'''  (CERTIFICATIONNAME,CERTIFICATIONVERSION)

答案 7 :(得分:0)

- 步骤1:创建临时表。     create table Billing(TAP_ID char(10),ACCT_NUM char(10));

SELECT * FROM BILLING;

- 步骤2:创建控制文件。

加载数据 infile IN_DATA.txt 进入表格账单 字段由&#39;,&#39;终止 (TAP_ID,ACCT_NUM)

- 步骤3:创建输入数据文件。 IN_DATA.txt文件内容: 100,15678966

- 步骤4:执行命令: ..  client \ bin&gt; sqlldr username @ db-sis__id / password control =&#39; Billing.ctl&#39;