有啥方法可以使用来自 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 来处理列?的主要内容,如果未能解决你的问题,请参考以下文章
有啥方法可以阻止来自 CANoe 总线上外部设备的特定 CAN 消息?