Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从CSV创建具有正确列类型的SQL表_Python_Sql_Postgresql_Pgadmin - Fatal编程技术网

Python 从CSV创建具有正确列类型的SQL表

Python 从CSV创建具有正确列类型的SQL表,python,sql,postgresql,pgadmin,Python,Sql,Postgresql,Pgadmin,我在这个网站上查看了很多问题,但找不到答案:如何从多个CSV源文件中创建多个新表(我使用的是PostgreSQL),其中新的数据库表列准确地反映了CSV列中的数据 我可以很好地编写CREATE TABLE语法,并且可以读取CSV文件的行/值,但是是否已经存在检查CSV文件并准确确定列类型的方法?在我建立自己的系统之前,我想检查一下这个系统是否已经存在 如果它还不存在,我的想法是使用Python、CSV模块和psycopg2模块构建一个Python脚本,该脚本将: 读取CSV文件 根据记录子集(1

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

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

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

  • 读取CSV文件
  • 根据记录子集(10-100行?),迭代检查每行的每一列,以自动确定CSV中数据的正确列类型。因此,如果A列第1行的值为12345(int),但A列第2行的值为ABC(varchar),系统将根据在前两次传递中找到的数据组合自动确定它应为varchar(5)格式。用户认为有必要确定列的可能类型和大小时,此过程可以进行多次
  • 按照CSV的列检查定义,构建创建表查询
  • 执行创建表查询
  • 将数据加载到新表中

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

    您似乎需要事先了解结构。 只要看第一行就知道你有多少列了

    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;
    
    开始;
    在COMMIT DROP上创建临时表foo(a文本、b文本、c文本等);
    使用csv从“file.csv”复制foo;
    结束;
    
    警告,该文件需要由postgresql进程本身访问。这就产生了一些安全问题。另一个选择是通过STDIN提供数据


    HTH

    我一直在处理类似的问题,最后编写了自己的模块,通过检查源文件来嗅探数据类型。所有反对者都有一些智慧,但也有一些理由值得这么做,特别是当我们无法控制输入数据格式(例如,处理政府公开数据)时,因此我在这个过程中学到了一些东西:

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

  • 如果你可以避免进行自动类型检测,那是值得的,但这并不总是实用的,所以我希望这些提示能有所帮助。

    虽然这是一个很老的问题,但似乎没有一个令人满意的答案,我一直在努力解决samen的问题。随着SQLServerManagementStudio 2018版的推出,微软提供了一个非常好的解决方案

  • 在对象资源管理器中数据库节点上的SSMS中,右键单击,选择“任务”并选择“导入数据”
  • 选择“平面文件”作为源,并在“常规”部分浏览到您的.csv文件。这里需要注意的一点是:确保目标SQL server中没有与文件名匹配的表
  • 在“高级”部分,单击“建议类型”,然后在下一个对话框中,优先输入文件中的总行数,或者,如果太多,输入足够大的行数以覆盖所有可能的值(这需要一段时间)
  • 单击next,然后在接下来的步骤中,连接到SQL server。现在,每个品牌都有自己的数据类型风格,但您应该在以后获得一套适合您口味的相关指针。我已经使用SQLServer本机客户端11.0对此进行了测试。请将您的意见留给其他提供商,作为对此解决方案的答复
  • 它来了。。。单击“编辑映射”
  • 单击“编辑SQL”et voila,这是一个很好的SQL语句,包含所有发现的数据类型
  • 单击至结尾,选择“立即运行”以查看在SQL server中使用相应类型创建的所有.csv列
  • 额外:
    如果对同一文件以完全相同的方式运行上述步骤两次,第一个循环将使用“CREATETABLE…”语句,但第二个go将跳过表的创建。如果将第二次运行另存为SSIS(Integration Services)文件,则可以稍后重新运行整个安装程序,而无需扫描.csv文件。

    是否尝试自动创建这样的表,以考虑多个csv源?每个源都有自己的表?否则我会认为