0

输入样本数据:

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
4

1 回答 1

0

您可以对传入的数据进行转换。它在控制文件中指定。有关示例,请参阅此最近的帖子:SQLLDR CTL:将 DDMonYYYY 中收到的日期字段加载到格式为 YYYYMM 或 MM/DD/YYYY 的 db 字段中

我会使用 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。

于 2014-11-13T21:56:17.107 回答