读取每次具有不确定列数的CSV文件,并根据csv文件中的列名创建表

时间:2014-02-26 14:30:29

标签: plsql oracle10g oracle-apex

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

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

例如:

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

文件2: col1 col2 col3 col4 col 5

文件3: col4 col2 col1 col3

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

此致 萨钦。

1 个答案:

答案 0 :(得分: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 - >实用程序 - >数据研讨会

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

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

  1. 通过客户端计算机上的浏览功能接受CSV格式的文件
  2. 上传文件并解析列布局的第一条记录(名称)
  3. 允许用户从上传的文件中创建新表,或映射到现有表。
  4. 对于新表,如果需要从上传的数据进行额外转换,则可以声明每个列数据类型,也可以声明特定的数字/日期掩码。
  5. 在解析上传文件之前,也可以声明分隔符类型,可选附件(如双引号),十进制约定和货币类型。
  6. 用户确定所有这些映射和设置后,将使用上载的数据创建表。之后立即报告记录上传中的任何错误,并对失败的记录进行详细反馈。

    要注意的安全考虑因素: 您可能不希望让最终用户访问您的APEX服务器的后端...但您可以创建一个新的工作区...仅适用于您的最终用户...创建一个新的数据库架构来接收他们的上传,可能需要一些小心资源控制。开发人员是所需的最小角色......但即使最终用户看到其他内容,也无法访问孤立工作区中的任何重要内容。

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