我通过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在其中一个记录中有一个新的行字符。任何人都可以提出解决方案。
由于
答案 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
这对我来说非常适合。