有啥方法可以使用来自 csv 的 MySQL 来处理列?

Posted

技术标签:

【中文标题】有啥方法可以使用来自 csv 的 MySQL 来处理列?【英文标题】:Any Way to Process Columns using MySQL from csv?有什么方法可以使用来自 csv 的 MySQL 来处理列? 【发布时间】:2021-08-01 08:14:10 【问题描述】:

我有一个 csv 文件,它有一个 ipv4 网络和掩码,格式如下:41.74.160.0/20

我想将它分成网络长和广播长,以便我可以检查此范围内的其他长,以便从另一个表中进行匹配。到目前为止,我只将它存储为一个字符串,因为 INET_ATON 接受一个字符串,但我最近发现它不支持掩码。我也一直在使用 LOAD DATA INFILE 作为我的解决方案,以便轻松获取表中的所有数据。

但是,在这个新解决方案中,我的表中的列显然与我的数据中的列不匹配。有什么方法可以通过处理 mysql 中 csv 文件的列来加载数据?如果没有,有没有简单的方法在 php 中做到这一点?

【问题讨论】:

你想在 41.74.160.0/20 这个 41.74.160.0 到 41.74.160.20 上进行什么预处理? 您可以将数据作为字符串导入临时表,然后使用存储过程对其进行处理,将其转换并放入实际表中。 是的,从 41.74.160.0 到 41.74.160.20 @futureweb 临时表是个好主意,但我的输入数据相当大,所以我担心额外的步骤太长/太大。如果没有其他选择,我可能会做类似@stickybit 的事情 Load data infile 可以连续转换数据,但不能生成新行,你似乎需要。如果只想使用 mysql,则必须使用临时表。使用 php(或任何其他编程语言),您可以逐行读取 csv 文件并动态生成行并将行插入 mysql(或任何其他数据库)。无论您选择哪种解决方案,它都需要逐行遍历您的数据并生成许多行,因此如果您有一个大文件,它不会很快。 ETL 过程确实需要时间。 【参考方案1】:

MySQL 可以预处理来自 CSV 文件的输入,如果我理解您的要求,这是一个简单的字符串操作问题。 SUBSTRING_INDEX()可以根据/作为分隔符提取IP地址和掩码。

从这张表开始:

CREATE TABLE `ipAddresses` (
  `id` int NOT NULL AUTO_INCREMENT,
  `ipComplete` varchar(45) NOT NULL,
  `ipAddress` varchar(45) NOT NULL,
  `ipMask` varchar(45) NOT NULL,
  `fieldName` varchar(45) NOT NULL,
  `inetNumeric` bigint NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB;

还有这个 CSV 输入:

"A field 1",41.74.160.0/20
"A field 2",41.74.160.1/20
"A field 3",41.74.160.2/20
"A field 4",41.74.160.3/20

这个查询:

load data infile '/sqlfiles/ips.csv' into table ipAddresses 
    columns terminated by ',' 
    enclosed by '"' 
    lines terminated by '\n'
    (fieldName, @ip) 
    set ipComplete = @ip, 
        ipAddress = substring_index(@ip,'/',1), 
        ipMask = substring_index(@ip,'/',-1), 
        inetNumeric = inet_aton(substring_index(@ip,'/',1));

给出这个结果:

# id    ipComplete      ipAddress    ipMask fieldName   inetNumeric
29      41.74.160.0/20  41.74.160.0  20     A field 1   692756480
30      41.74.160.1/20  41.74.160.1  20     A field 2   692756481
31      41.74.160.2/20  41.74.160.2  20     A field 3   692756482
32      41.74.160.3/20  41.74.160.3  20     A field 4   692756483

【讨论】:

以上是关于有啥方法可以使用来自 csv 的 MySQL 来处理列?的主要内容,如果未能解决你的问题,请参考以下文章

来自csv的Python MySQL INSERT

有啥方法可以接受来自非本地 Web 应用程序的读卡器刷卡?

有啥方法可以优化这个 mysql 查询?

有啥方法可以阻止来自 CANoe 总线上外部设备的特定 CAN 消息?

当列不明确时,有啥方法可以强制 Mysql 在 where 子句中使用 select 中的列?

在 HTML 页面中显示来自 CSV 文件的大量数据的方法?