当并非所有列都得到保证时,将数据从csv导入数据库

时间:2018-07-02 18:30:55

标签: sql database import

我正在尝试为数据库构建一个自动功能,该功能可以获取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(降雪量,单位为mm)。但是,如果您查看新泽西州的气象站,就会发现此列,因为它们报告了降雪量。这意味着在不同的报表之间不可能实现列的1:1映射,并且不能保证列的顺序。

更糟糕的是,某些天气类型的定义中包含通配符,例如SN *#,其中*是0-8代表地面类型的数字,#是1-7代表代表土壤最低温度的土壤温度的深度,我们希望将它们汇总在一起

所有这些都是列标题,而我的直觉是构建一个小型Java程序,以根据需要将它们正确地映射到我们的数据集。但是,我的上级认为,可以通过数据库批量导入来执行此操作,但是他不知道该怎么做。

是否可以通过批量导入来实现,还是对我来说最好编写Java程序以将数据转换为我们的格式?

正在使用的系统: MariaDB用于数据库。 适用于操作系统的Centos7(如果确实有问题) Java是通过JPA和Spring Boot完成的,必要时使用休眠功能。

1 个答案:

答案 0 :(得分:0)

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

我假设前6个字段始终存在,并且接下来的5个字段中出现0次或多次。如果您使用的是SQL Server,则可以按以下方式进行操作

  1. 查询information_schema目录以获取其中的字段计数 桌子。如果count = 6,则没有观测值,如果11 列,那么您有1个观测值,如果有17个则有2个观测值 观察结果等

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

很抱歉,如果我的假设不对。

-HTH