0

我有 30k+ 具有不同列数、空格分隔的文本文件,任务是将数据、列明智地加载到 1 个大 oracle 表中。详细信息和可能的方法如下:

文本文件 1-

Date Time SiteName CompName ipAdd
jkl mno pqr stu vwx

文本文件 2-

Date CompName ipAdd
abc def ghi

文本文件 3-

Date SiteName 
mno pqr

预期的 Oracle 表 -

Date Time SiteName CompName ipAdd
jkl mno pqr stu vwx
abc         def ghi
mno     pqr

现在,如您所见,有不同数量的“相同”列分布在多个文本文件中。而且我必须将数据加载到 1 个大 oracle 表中。

请注意:

在所有文本文件中,第一列始终是“日期”,并且这些列按顺序出现,即从日期到时间..或日期到 CompName...(从日期开始递增的顺序)

问题是我找不到一种使用 SQL Loader 的方法,它可以区分 2 个不同文本文件中的 2 列和 15 列,即使我在第一行文本文件中有它们的名称,然后加载他们在一张大桌子上。

方法:

  • 将所有文本文件合并为 1 个大文本文件并执行某些操作 - 失败
  • 试图放置一个分隔符,用于所有文本文件(25 列)中的最大列数,并做一些事情 - 不能
  • 在 35k+ 个 oracle 表中加载 35k+ 个文本文件,然后坐下来将这些 35k+ 个 oracle 表组合成 1 个大表 - 由我周围的 PPL 推荐,但它太长了,可能是空间和时间/工作效率低下,所以我寻找一个真正的替代品

请给出你最好的方法。:-(

4

2 回答 2

1

假设您发布的示例是准确的,并且每个文件的第一行是列标题,这是我将采用的一般方法。(如果每个文件的第一行不是列标题,我认为你已经塞满了)。

在 *nix 上这一切都比在 Windows 上容易得多,尽管我希望 Powershell 可以处理这些任务(我不是 Powershell 人)。

  1. 编写一个 shell 脚本来读取每个文件的第一行并将其写入列表文件以及文件名。
  2. 按所有列对该列表文件的内容进行排序。这将按列对所有文件名进行分组。您需要这样做,因为仅知道列数是不够的:我假设某些具有三列的文件将拥有Date Time SiteName,而其他文件将拥有Date Time ipAdd
  3. 我建议您在列表文件中标记每个组。这将非常乏味,值得使用文本处理器进行自动化,尽管现在我不确定我将如何做到这一点。
  4. 您将需要为前面阶段中确定的每个列排列编写一个加载器文件。
  5. 然后您需要将每个文本文件与适当的控制文件一起提交给加载程序。这就是为什么用组标记每个文件名是一个好主意:这将使这个阶段更容易自动化。

顺便说一句,使用外部表而不是 SQL Loader会更简单。外部表的 DDL 比 Loader 控制文件更容易编写,您可以使用 SQL 来查询它们。基本上,外部表是临时表,但数据在 OS 文件中而不是在数据库中。

请注意,您不需要 35,000 个临时表。对于所有文本文件中的每个不同的列组合,您只需要一个。当然,鉴于您的目标表中有 25 列,可能的排列数是 huuuuuge,但我们假设它实际上是一个可管理的数字。

于 2012-05-16T17:10:47.857 回答
0

将每个文件加载到与文件结构匹配的临时表中。然后使用sql代码清理数据并将其移动到最终的生产表中。

或者,将文件退回给发送给您的人,并拒绝接受它们,因为它们符合标准文件规范。

于 2012-05-16T16:36:03.760 回答