【问题标题】:Sql loader - second enclosure string not presentSql 加载程序 - 第二个附件字符串不存在
【发布时间】:2014-01-24 12:06:38
【问题描述】:

我正在通过 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 字段的其中一条记录中有一个换行符。任何人都可以为此提出解决方案。

谢谢

【问题讨论】:

    标签: oracle sql-loader


    【解决方案1】:

    如果您的最后一个字段始终存在(尽管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;""
    

    或者如果你总是在 cmets 字段之后有一个分隔符,不管它是否被填充:

    ...
    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'",但我无法检查。

    【讨论】:

    • @Alex...嗨,Alex。感谢您的回复。正如您所说, cmets 列可能包含 NULL 值,这就是我选择 TRAILING NULCOLS 的原因。从给定的选项中,第一个(continueif last != x'22')工作正常。但是,现在的问题是,没有换行符的列没有加载。
    • @Alex...嗨,Alex,这些是我的 3 列样本数据...................... aaaa 300 cav4VO; 23.07.2010;280-VIN 验证;按要求完成返工(L928 91002 000 C2,版本 007)
    • @VinodChelladurai - 您的评论值(包括 null)是否可以始终用引号括起来,或者之后有一个终止符,和/或以不同的顺序?该示例数据似乎有 4 列,但注释字段似乎没有任何内容可以让您区分拆分条目。
    • @Alex....就我分析数据而言,cmets 字段之后没有任何终止符,也不必总是用引号括起来....此外,我们有这个 .csv 文件很长一段时间,我最近才被要求加载这个 sqlloader。感谢您的帮助
    • @Alex...希望你能理解我的回复
    【解决方案2】:
    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 文件中的最后一个字段。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • @San...您好,感谢您的回复。替换不起作用。我使用了 regexp_replace,就像在您的评论中一样。没有运气...:(
      【解决方案4】:

      我找到了加载包含换行符和逗号的字段的 .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
      

      它对我来说运行完美。

      【讨论】:

        猜你喜欢
        • 2022-11-22
        • 2015-03-07
        • 2017-01-24
        • 1970-01-01
        • 2015-12-29
        • 2018-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多