2012-05-31 103 views
4

我对数据库和编程很新颖。我不太擅长电脑术语,所以坚持我。我有一个csv文件,我试图加载到我的Oracle数据库中。它包含帐户信息,如姓名,电话号码,服务日期等我已安装Oracle 11g Release 2。这是我做了什么至今一步一步..在Oracle中使用SQL LOADER导入CSV文件

1)冉SQL装载机

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

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)它促使我创建表。接下来,我为记事本中的数据创建了一个控制文件,该文件位于与我的结算表相同的目录中,并且具有.ctl扩展名。 GIS.csv是文件IM从得到的数据,也是在同一个目录,并把它命名为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号”, “地铁ID”, “SERV HOUSE”, “SERV STREET”,“SERV ^”

我不明白为什么它要起一个错误。我的帐单。 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) 

有什么想法?

+0

我已将最新的错误添加到原始问题中,因为它不是答案。错误的答案很快就会被删除。另外,我更新了我的答案(见下文)。 – Codo

+0

只是一点。您的ctl文件不正确。一个csv文件有可选的'''列外壳,所以你还需要使用''''也可以使用'''''' – Ben

回答

4

SQLLDR想要写在控制文件在同一目录的日志文件。但很明显,它不能。它可能不具备需要许可

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

touch Billing.log 

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

更新

正确的命令行是:

sqlldr myusername/mypassword control=Billing.ctl 
+0

我有Windows 7,我试图为每个人设置该文件夹的权限。但仍然没有运气。任何其他想法? –

+0

GIS.csv和Billing.ctl在同一个目录中吗?在开始之前* * *进入该目录* sqlldr *? Billing.log文件是否已经存在? (如果是这样,请先删除它。) – Codo

+0

我刚把文件移动到一个单独的目录中,这次我得到了一个不同的错误。顺便提一下,Billing.ctl和GIS.csv是在同一个目录中。但现在我有另一个错误。 –

0

“1号线” - 或许真的有关Windows VS UNIX换行符? (正如我看到上面提到的Windows 7)。

+0

你是什么意思?对不起哈哈 –

+0

似乎你的ctl文件中有语法错误。事实上,sqlldr指向第1行,我没有看到任何问题可能意味着,你得到你的文件用unix换行符(回车)写入,以便sqlldr看到(窗口版本)只是一行。 (否则我看不出有什么问题 - 但你更熟悉oracle命令行工具:-))无论如何,尝试检查执行sqlldr命令的方式,我倾向于使用以下方法:sqlldr control = file.ctl data = file.dat bad = file.bad。 –

2

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

如何导入ORACLE DATABASE中的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扩展名,选择文件类型为所有类型(*)。这里控制文件被命名为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. 
    
0

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

0

LOAD DATA INFILE 'd:\ CertificationInputFile.csv' INTO TABLE CERT_EXCLUSION_LIST FIELDS TERMINATED BY “|” OPTIONALLY ENCLOSED BY '“' (CERTIFICATIONNAME,CERTIFICATIONVERSION)

1

试试这个

LOAD DATA INFILE '数据文件位置' 为表模式。以','结尾的表名字段可选用'|'括起来(FIELD1,FIELD2,字段3 ....)

在命令提示:

sqlldr [email protected]/password control='control file location' 
0

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

SELECT * FROM BILLING; 

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

负载数据 infile的IN_DATA.txt 成表帐单 字段由终止 '' (TAP_ID,ACCT_NUM)

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

- 步骤4: .. 客户\ BIN> SQLLDR用户名@ DB-sis__id /密码控制= 'Billing.ctl'

:从运行执行命令