SQL加载器 - 不存在第二个外壳字符串



我正在通过SQL加载程序将.CSV文件数据加载到Oracle表中。其中一个字段在其数据中具有新的行字符(CRLF),因此,正在遇到以下错误:

第二个外壳字符串不存在

这是我的控制文件

load data
characterset UTF8
infile 'C:Userslab.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)"
)

字段评论在其一个记录之一中具有新的行字符。任何人都可以建议解决方案吗?

谢谢

如果您的最后一个字段始终存在(尽管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,您可以使用流记录格式更改记录分离器:

...
infile 'C:Userslab.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 ';rn'",但我无法检查。

load data
characterset UTF8
infile 'C:Userslab.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文件中的最后一个字段。

您可以使用replace(replace(column_name, chr(10)), chr(13))删除Newline Charactors或regexp_replace(column_name, 's+')在加载过程中删除非可打印的炭镜

我找到了加载.csv文件的最佳方法,其中包含newline和comma的字段。请通过.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

它对我来说是完美的。

最新更新