11

我在这个网站上查看了一些问题,但找不到问题的答案:如何从多个 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. 执行创建表查询。
  5. 将数据加载到新表中。

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

4

3 回答 3

7

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

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

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

于 2014-02-20T19:04:13.843 回答
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 提供它。

高温高压

于 2012-11-17T11:15:25.087 回答
0

虽然这是一个相当古老的问题,但它似乎没有一个令人满意的答案,我一直在努力解决完全相同的问题。随着 SQL Server Management Studio 2018 版的到来 - 可能在此之前 - 微软提供了一个非常好的解决方案。

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

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

于 2018-09-30T20:14:44.443 回答