【问题标题】:Oracle SQL Pipe Delimited File w/One Comma Delimited Column to Split and Load Using SQLLDROracle SQL 管道分隔文件,带一个逗号分隔列,使用 SQLLDR 进行拆分和加载
【发布时间】:2014-11-13 21:09:44
【问题描述】:

输入样本数据:

Style|Size|Codes
Modern|9|A224, B153, C166
Retro|8|D532, E533, F122
Vintage|7|G324, H243, I432

使用 SQLLDR - 需要此输出:

Style     Size     Code1      Code2      Code3
Modern    9        A224       B153       C166
Retro     8        D532       E533       F122
Vintage   7        G324       H243       I432

【问题讨论】:

    标签: split sql-loader delimited


    【解决方案1】:

    您可以对传入的数据进行转换。它在控制文件中指定。请参阅此最近的帖子以获取示例:SQLLDR CTL: Load date field received in DDMonYYYY to db fields with formats of YYYYMM or MM/DD/YYYY

    我会使用 REGEXP_SUBSTR 从逗号分隔列表中的位置提取各种代码。试一试,让我们知道会发生什么。

    看起来您的目标表将包含有限数量的代码列。如果您的数据的 coeds 比目标表的列数多怎么办?考虑为一个项目创建自己的代码表,以免违反第一范式(每列只有一个值)。

    如果源文件中的代码字符串确实是作为项目一部分的描述,那么它们很可能应该作为 code_description 列保留在一起。这取决于您的应用或报告如何使用这些数据。

    话虽如此,诀窍是将代码字段定义为 BOUNDFILLER。这表示将其视为 FILLER 而不是加载它,而是让它在以后的表达式中用作绑定变量。在你的控制文件中试试这个:

    LOAD DATA
    INFILE 'data.txt'
    APPEND
    INTO TABLE X_TEST
    FIELDS TERMINATED BY '|'
    TRAILING NULLCOLS
    (
     STYLE       CHAR
    ,SIZE        CHAR
    ,CODESTRING  BOUNDFILLER
    ,CODE1      "trim(regexp_substr(:CODESTRING, '([^,]*)(,|$)', 1, 1, NULL, 1))"
    ,CODE2      "trim(regexp_substr(:CODESTRING, '([^,]*)(,|$)', 1, 2, NULL, 1))"
    ,CODE3      "trim(regexp_substr(:CODESTRING, '([^,]*)(,|$)', 1, 3, NULL, 1))"
    )
    

    正则表达式可以读作“返回第 n 次出现的零个或多个非逗号字符后跟逗号或行尾,并返回第一个子组(即数据减去逗号或行的末尾)。只需将其包装在对 TRIM() 的调用中以删除空格或等待 REGEXP 向导之一提供改进的 REGEX。如果只有 2 个代码,则 CODE3 将为 NULL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 2020-07-21
      • 2013-10-05
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多