【问题标题】:Read a CSV file that have indefinite number of columns every time and create a table based on column names in csv file每次读取一个列数不定的 CSV 文件,并根据 csv 文件中的列名创建一个表
【发布时间】:2014-03-29 11:05:28
【问题描述】:

我需要使用 oracle apex 或 pl/sql 代码将 csv 加载到 DB 中,但问题是他们要求加载不会带有相同数量的列和列名的 csv 文件。

我应该根据我正在上传的文件名和数据动态创建表并上传数据。 对于每个文件,我需要动态创建一个新表并插入 csv 文件中存在的数据。

例如:

文件 1: col1 col2 col3 col4 (注意:如果我上传文件 1,表应根据文件名动态创建,表应包含与 csv 文件的列标题相同的列名和数据。)

文件 2: col1 col2 col3 col4 col 5

文件 3: col4 col2 col1 col3

根据列和文件名,我需要为每个文件上传创建表。 我们可以这样加载吗? 如果是,请帮助我。

问候, 萨钦。

【问题讨论】:

  • 有可能,但有点难看。你怎么知道列应该是什么数据类型?文件是否在服务器上可用;它们中的数据是否会被操作,或者可以将它们创建为外部表(而不是加载到普通表中)?

标签: plsql oracle10g oracle-apex


【解决方案1】:

((此解决方案中的 PL/SQL 代码在哪里!!??!请耐心等待... 答案埋在这里的某个地方……我介绍了一些注意事项 以及在进入之前需要考虑的假设 任务。最后,你会发现 Oracle APEX 实际上有一个 完全满足您指定的内置解决方案...... 一些警告。))

如果您在 Oracle APEX 平台中工作,您将获得一些优势。 APEX 版本 4.2 及更高版本有一个名为“数据加载”的新页面元素。然而缺点是上传目标的定义是固定的而不是动态的。在加载数据之前,您需要了解表格的结构。

解决此问题的一种方法是构建一个通用的两列表作为您的目标,它将用于所有上传。第 1 列将是您的文件名,第 2 列将是单个 clob 数据类型,它将包含整个数据文件的内容,包括标题行。 “数据加载”元素将使用户有机会通过几次单击来验证和选择此映射约定。

此时,主要是 PL/SQL 后端工作来解析和转换上传的数据。至于动态表创建,我注意到 Oracle 包 DBMS_SQL 允许执行 DDL SQL 命令,这可能是创建自定义表的途径。

Alex Poole 的评论也很重要,您需要对数据类型做出一些笼统的假设,或者提供有关所包含数据类型的更多线索。假设您可以依赖现有数据值的样本并不好......如果您上传的所有值都为空怎么办?我建议在数据输入中使用第二列,其中包含有关每列数据类型的线索......就像预期的标题名称一样,也许:AAAAA = 用于五个字符的列,# = 用于数字,MM/DD /YYYY = 带有特定掩码的日期。

更简单的路线: 您需要允许最终用户访问 APEX 服务器工作区上的开发人员角色帐户。它并不像你想象的那么可怕。通过仔细的指导和一些简单的预防措施,即使是最不懂技术的用户,我也能完成这项工作。之所以会这样,是因为在下面的菜单项下发现了一个更强大的上传工具:

SQL Workshop --> 实用工具 --> Data Workshop

“数据加载”下有一个选择-->“电子表格数据”

数据加载工具会自动执行以下操作:

  1. 通过客户端计算机上的浏览功能接受 CSV 格式的文件
  2. 上传文件并解析列布局(名称)的第一条记录
  3. 允许用户从上传的文件创建新表,或映射到现有表。
  4. 对于新表,可以声明每个列数据类型,如果需要从上传的数据进行额外转换,还可以声明特定的数字/日期掩码。
  5. 也可以在解析上传的文件之前声明分隔符类型、可选的附件(如双引号)、小数约定和货币类型。

一旦用户确定了所有这些映射和设置,就会使用上传的数据创建表格。记录上传中的任何错误都会在之后立即报告,并提供有关失败记录的详细反馈。

需要注意的安全注意事项: 您可能不想让最终用户访问您的 APEX 服务器的后端...但是您可以创建一个新的工作区...只为您的最终用户...创建一个新的数据库模式来接收他们的上传,可能需要一些小心资源控制。开发人员是所需的最低角色……但即使最终用户看到其他内容,也无法从隔离的工作区访问任何重要的内容。

几年前,我在 4.0/4.1 版本的 APEX 平台上实现了隔离工作区方法,并且效果很好。我们的最终用户可以控制她的数据输入的分期和质量检查(来自从多种来源收集的 excel 电子表格/csv 导出)。我想将她完全从图片中剔除并专注于自动化我们的数据库和她的其他来源之间的导出-审查-上传过程可能会更好。在这种情况下,所涉及的数据量不够大(100 到 1000 条记录),并且在将导出的数据推送到数据库之前需要手动审查和编辑非常重要......所以人为因素是在这种情况下仍然很重要 - 这是您现在要考虑的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-23
    • 2020-03-16
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    相关资源
    最近更新 更多