我有一个csv文件,它有一个ipv4网络和掩码,格式如下: 41.74.160.0/20
我想把它分成网络长整型和广播型长整型,这样我就可以检查在这个范围内的其他长整型,以便从另一个表中进行匹配。到目前为止,我只是将它存储为一个字符串,因为INET_ATON接受一个字符串,但我最近发现它不支持掩码。我还一直使用LOAD DATA INFILE作为我的解决方案,以便轻松获取表中的所有数据。
然而,在这个新的解决方案中,我的表中的列显然与我的数据中的列不匹配。有没有办法在MySql中从csv文件中加载数据并对列进行处理?如果不是,有没有一种简单的方法可以用PHP做到这一点呢?
发布于 2021-05-11 08:46:13
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 692756483https://stackoverflow.com/questions/67478675
复制相似问题