我在这个网站上看了很多问题但找不到问题的答案:如何在数据库中创建多个新表(在我的情况下我使用的是PostgreSQL)来自多个CSV源文件,其中新数据库表列准确反映了CSV列中的数据?
我可以编写CREATE TABLE语法,我可以读取CSV文件的行/值,但是已经存在检查CSV文件并准确确定列类型的方法吗?在我建立自己之前,我想检查一下是否已存在。
如果它不存在,我的想法是使用Python,CSV模块和psycopg2模块来构建一个python脚本:
这样的工具是否已存在于SQL,PostgreSQL,Python中,或者是否有其他应用程序用于实现此目的(类似于pgAdmin3)?
答案 0 :(得分:5)
我一直在处理类似的事情,最后通过检查源文件编写自己的模块来嗅探数据类型。所有反对者都有一些智慧,但也有理由这样做,特别是当我们对输入数据格式没有任何控制时(例如使用政府公开数据),所以这里有一些我学到的东西在这个过程中:
如果你可以避免进行自动类型检测,那么值得避免它,但这并不总是实用的,所以我希望这些技巧有所帮助。
答案 1 :(得分: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;
警告提示,postgresql进程本身需要访问该文件。这会产生一些安全问题。其他选择是通过STDIN提供它。
HTH
答案 2 :(得分:0)
尽管这是一个很老的问题,但它似乎并没有令人满意的答案,我正在努力解决确切的Samen问题。随着SQL Server Management Studio 2018版的到来-也许在此之前-Microsoft提供了一个很好的解决方案。
额外: 如果对相同文件使用相同的方式两次运行上述步骤,则第一个循环将使用“ CREATE TABLE ...”语句,但是第二个循环将跳过表创建。如果将第二次运行另存为SSIS(集成服务)文件,则以后可以重新运行整个安装程序,而无需扫描.csv文件。