【问题标题】:Import data from csv into database when not all columns are guaranteed在不能保证所有列的情况下将数据从 csv 导入数据库
【发布时间】:2018-07-02 18:30:54
【问题描述】:

我正在尝试为获取 NOAA 天气数据并将其导入我们自己的数据库表的数据库构建一个自动功能。

目前我们有 3 个步骤:

1. Import the data literally into its own table to preserve the original data
2. Copy it's data into a table that better represents our own data in structure
3. Then convert that table into our own data

我遇到的问题源于 NOAA 提供给我们的数据。它采用以下格式:

Station    Station_Name    Elevation    Latitude    Longitude    Date   MXPN    Measurement_Flag    Quality_Flag    Source_Flag    Time_Of_Observation   ...

从 MXPN(锅中水的最高温度)开始,例如由它的列和其后的其他 4 列组成,它为每种天气观测形式重复相同的 5 列。但问题是,如果在报告的任何站点中都没有观测到特定类型的天气,那么这组 5 列将被完全省略。

例如,如果您查看佛罗里达州中部的车站,您会发现没有 SNOW(降雪量以毫米为单位)。但是,如果您查看新泽西州的车站,您会在他们报告降雪时发现此列。这意味着在不同的报告之间不可能实现列的 1:1 映射,并且列的顺序可能无法保证。

更糟糕的是,一些天气类型的定义中包含通配符,例如SN*# 其中 * 是 0-8 之间的一个数字,代表地面类型,# 是一个数字 1-7,代表最低土壤温度的土壤温度深度,我们想将这些收集在一起.

所有这些都是列标题,我的直觉是构建一个小型 Java 程序,将它们正确映射到我们想要的数据集。但是,我的上级认为可以让数据库在批量导入时执行此操作,但他不知道如何执行此操作。

有没有办法以批量导入的方式执行此操作,或者我最好只编写 Java 程序来将数据转换为我们的格式?

使用的系统: MariaDB 用于数据库。 用于操作系统的 Centos7(如果它真的成为问题) Java 正在使用 JPA 和 Spring Boot 完成,必要时使用休眠。

【问题讨论】:

  • 报告是否也会因一年中的时间而有所不同 - 新泽西州的报告是否跳过了 8 月的雪柱?
  • 是的,简而言之,如果在特定窗口(一组电台和日期范围)内的某个部分中没有报告任何内容,则不会出现列。
  • 您是否正在寻找将任何天气数据文件导入单个临时表的方法,其中列是所有数据文件的超集?
  • 是的,我在写这个问题时试图想到的那些花哨的词。有一个例外,但不一定是一个,特别是格式为 SN*#、SX*#、WT## 和 WV## 的字段可能会出现多次,我们希望压缩它们,但这不需要发生在临时表中。
  • 我应该澄清另一个想法,有很多重复的列。对于每种天气类型,Measurement_Flag、Quality_Flag 等列都是重复的。因此,任何解决方案都需要在映射它们时考虑到这一点,以便在表单中的天气类型之后立即映射它们。

标签: sql database import


【解决方案1】:

您正在为每个文件创建一个新表。

我假设前 6 个字段始终存在,并且接下来的 5 个字段出现 0 次或多次。如果您使用的是 SQL Server,我会按如下方式处理它,

  1. 查询 information_schema 目录以获取其中的字段计数 桌子。如果计数 = 6,则不存在观察,如果 11 列,那么你有 1 个观察,如果 17,那么你有 2 观察等。

  2. 既然您知道观察次数,您可以编写一些 SQL 这将循环观察并将它们插入到 带有返回到具有第一个 6 的父表的链接的子表 字段。

抱歉,如果我的假设有偏差。

-HTH

【讨论】:

  • 感谢您的回答,虽然我们没有使用 MS SQL Server,但您的一些回答似乎敲响了他想要这样做的一些钟声。我们目前正在使用 MariaDB,它是一种 SQL 类型的服务器,但根据他的说法,我们将不得不进行一些不同的操作。
猜你喜欢
  • 2019-04-12
  • 2017-06-30
  • 2019-03-09
  • 1970-01-01
  • 2011-08-08
  • 2018-01-27
  • 2018-01-24
  • 1970-01-01
  • 2013-05-02
相关资源
最近更新 更多