Sql loader - 第二个机箱字符串不存在

时间:2014-01-24 12:06:39

标签: oracle sql-loader

我通过sql loader将.csv文件数据加载到oracle表中。其中一个字段的数据中有一个换行符(CRLF),因此得到以下错误:

第二个外壳字符串不存在

这是我的控制文件

load data
characterset UTF8
infile 'C:\Users\lab.csv'
truncate 
into table test_labinal
fields terminated by ";" optionally enclosed by '"' 
TRAILING NULLCOLS
      ( 

    STATEMENT_STATUS ,
    MANDATORY_TASK ,
    COMMENTS CHAR(9999)  "SubStr(:Comments, 0, 1000)"
)

字段COMMENTS在其中一个记录中有一个新的行字符。任何人都可以提出解决方案。

由于

4 个答案:

答案 0 :(得分:5)

如果您的最后一个字段始终存在(虽然trailing nullcols表明它不存在)并且您可以控制格式,您可以使用CONTINUEIF指令将第二行视为相同的逻辑记录。

如果comments字段始终存在并用双引号括起来,那么您可以这样做:

...
truncate
continueif last != x'22'
into table ...

哪个会处理数据记录,如:

S;Y;"Test 1"
F;N;"Test 2"
P;Y;"Test with
new line"
P;N;""

或者,如果您在评论字段后面始终有分隔符,则是否填充:

...
truncate
continueif last != ';'
into table ...

哪个会处理:

S;Y;Test 1;
F;N;"Test 2";
P;Y;Test with
new line;
P;N;;

两种方式都将数据加载为:

S M COMMENTS
- - ------------------------------
S Y Test 1
F N Test 2
P Y Test withnew line
P N

但这会从数据中丢失新的一行。为了保证您需要终止字段分隔符,而不是CONTINUEIF,您可以使用stream record format更改记录分隔符:

...
infile 'C:\Users\lab.csv' "str ';\n'"
truncate
into table ...

"str ';\n'"将终结符定义为字段终止符和新行字符的组合。您的拆分评论仅在最后一行中具有该组合。使用与先前版本相同的数据文件,这给出:

S M COMMENTS
- - ------------------------------
S Y Test 1
F N Test 2
P Y Test with
    new line

P N

4 rows selected.

由于您使用的是Windows,因此您可能必须在格式中包含\r,例如"str ';\r\n'",但我无法检查。

答案 1 :(得分:1)

load data
characterset UTF8
infile 'C:\Users\lab.csv'
truncate 
into table test_labinal
fields terminated by ";" optionally enclosed by '"' 
TRAILING NULLCOLS
      ( 

    STATEMENT_STATUS ,
    MANDATORY_TASK ,
    COMMENTS CHAR(9999)  "SubStr(REPLACE(REPLACE(:Comments,CHR(13)),CHR(10)), 0, 1000)"
)

注意:CHR(13)是"回车"的ASCII字符。并且CHR(10)是"新行"的ASCII字符。使用没有替换值的Oracle PL / SQL REPLACE命令将删除任何"回车符"和/或"新行"嵌入数据中的字符。可能是这种情况,因为注释字段是CSV文件中的最后一个字段。

答案 2 :(得分:0)

您可以使用replace(replace(column_name, chr(10)), chr(13))删除换行符或regexp_replace(column_name, '\s+')删除加载期间不可打印的字符

答案 3 :(得分:0)

我找到了使用包含换行符和逗号的字段加载.csv文件的最佳方法。请在.csv文件上运行宏,然后使用sqlloader加载

Sub remove()
Dim row As Integer

Dim oxcel As Excel.Application
Dim wbk As Excel.Workbook
Set oxcel = New Excel.Application
Set wbk = oxcel.Workbooks.Open("filename.csv", 0, True)
row = 0
With oxcel
.ActiveSheet.Select
 Do
 row = row + 1
    'Assume first column is PK and so checking for empty pk to find the number of rows
  Loop Until IsEmpty(Cells(row, 1)) Or IsNull(Cells(row, 1))
  Range(Cells(1, 24), Cells(row - 1, 24)).Select
  For Each oneCell In Selection
  oneCell.Value = Application.Substitute(Application.Substitute 
 (Application.Substitute  (CStr(oneCell.Value), vbLf, vbCr), vbCr, "-"),",","-")

    Next oneCell

    End With
     End Sub

这对我来说非常适合。