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

时间:2012-11-05 19:30:10

标签: python sql postgresql pgadmin

我在这个网站上看了很多问题但找不到问题的答案:如何在数据库中创建多个新表(在我的情况下我使用的是PostgreSQL)来自多个CSV源文件,其中新数据库表列准确反映了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 query。
  5. 将数据加载到新表中。
  6. 这样的工具是否已存在于SQL,PostgreSQL,Python中,或者是否有其他应用程序用于实现此目的(类似于pgAdmin3)?

3 个答案:

答案 0 :(得分:5)

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

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

答案 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提供了一个很好的解决方案。

  1. 在对象浏览器中数据库节点上的SSMS中,右键单击,选择“任务”,然后选择“导入数据”;
  2. 选择“平面文件”作为源,然后在“常规”部分中浏览到.csv文件。这里的重要说明:确保目标SQL服务器中没有与文件名匹配的表;
  3. 在“高级”部分中,单击“建议类型”,然后在下一个对话框中,最好输入文件中的总行数;如果过多,则输入足够大的行数以覆盖所有可能的值(这需要一个一会儿);
  4. 单击下一步,然后在后续步骤中连接到SQL Server。现在,每个品牌都有自己的数据类型风格,但是稍后您应该获得一组适合您的口味的相关指针。我已经使用SQL Server Native Client 11.0对此进行了测试。请留下您对其他提供商的评论,以作为对此解决方案的回复;
  5. 在这里...点击“编辑映射” ...;
  6. 单击“编辑SQL”等,这是一个不错的SQL语句,其中包含所有发现的数据类型;
  7. 单击到最后,选择“立即运行”以查看在SQL Server中使用适当类型创建的所有.csv列。

额外: 如果对相同文件使用相同的方式两次运行上述步骤,则第一个循环将使用“ CREATE TABLE ...”语句,但是第二个循环将跳过表创建。如果将第二次运行另存为SSIS(集成服务)文件,则以后可以重新运行整个安装程序,而无需扫描.csv文件。