我正在通过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
它对我来说是完美的。