使用CSV创建具有正确列类型的SQL表

Rya*_*ton 10 python sql postgresql pgadmin

我在这个网站上看了很多问题并且找不到问题的答案:如何在多个CSV源文件中创建数据库中的多个新表(在我的情况下我使用的是PostgreSQL),其中新的数据库表列准确反映CSV列中的数据?

我可以编写CREATE TABLE语法,我可以读取CSV文件的行/值,但是是否已经存在检查CSV文件并准确确定列类型的方法?在我建立自己之前,我想检查一下是否已存在.

如果它不存在,我的想法是使用Python,CSV模块和psycopg2模块来构建一个python脚本,它将:

  1. 阅读CSV文件.
  2. 根据记录子集(10-100行?),迭代检查每行的每一列,以自动确定CSV中数据的右列类型.因此,如果第1行,第A列的值为12345(int),但是第A列的第2行的值为ABC(varchar),系统将自动确定它应该是基于组合的格式varchar(5)它在前两个通道中找到的数据.该过程可以进行多次,因为用户认为有必要确定柱的可能类型和大小.
  3. 根据CSV的列检查定义构建CREATE TABLE查询.
  4. 执行create table查询.
  5. 将数据加载到新表中.

这样的工具是否已经存在于SQL,PostgreSQL,Python中,或者我应该使用另一个应用程序来实现这一点(类似于pgAdmin3)?

小智 5

我一直在处理类似的事情,最后通过检查源文件编写自己的模块来嗅探数据类型.所有反对者都有一些智慧,但也有理由这样做,特别是当我们对输入数据格式没有任何控制时(例如使用政府公开数据),所以这里有一些我学到的东西进行中:

  1. 虽然它非常耗时,但值得运行整个文件而不是一小部分行.将列标记为数字会导致每隔几千行有文本因此无法导入,从而浪费了更多时间.
  2. 如果有疑问,请故障转移到文本类型,因为更容易将它们转换为数字或日期/时间,而不是尝试推断在错误导入中丢失的数据.
  3. 检查看起来是否为整数列的前导零,并将其作为文本导入(如果有的话) - 这是ID /帐号的常见问题.
  4. 给自己一些手动覆盖某些列的自动检测类型的方法,这样您就可以将一些语义感知与自动键入大部分列的好处相结合.
  5. 日期/时间字段是一场噩梦,根据我的经验,通常需要手动处理.
  6. 如果以后要向此表添加数据,请不要尝试重复类型检测 - 从数据库中获取类型以确保一致性.

如果你可以避免必须进行自动类型检测,那么值得避免它,但这并不总是实用的,所以我希望这些技巧有所帮助.


小智 1

看来你需要预先了解结构。只需阅读第一行即可知道您有多少列。

CSV 不携带任何类型信息,因此必须从数据上下文中推断出。

改进之前稍微错误的答案,您可以创建一个包含 x 个文本列的临时表,用数据填充它,然后处理数据。

BEGIN;
CREATE TEMPORARY TABLE foo(a TEXT, b TEXT, c TEXT, ...) ON COMMIT DROP;
COPY foo FROM 'file.csv' WITH CSV;
<do the work>
END;
Run Code Online (Sandbox Code Playgroud)

警告一下,该文件需要可由 postgresql 进程本身访问。这会产生一些安全问题。另一种选择是通过 STDIN 提供它。

华泰