我正在从 CSV
文件导入一些数据,大于 1000
的数字会变成 1,100
等。
从中删除引号和逗号以便将其放入 int
字段中的好方法是什么?
编辑:
数据实际上已经在 MySQL 表中,所以我需要能够使用 SQL 来实现。抱歉弄错了。
最佳答案
我的猜测是因为数据能够导入该字段实际上是一个 varchar 或一些字符字段,因为导入到数字字段可能会失败。这是我运行纯 MySQL、SQL 解决方案的测试用例。
该表只是一个单独的列 (alpha),它是一个 varchar。
mysql> desc t; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | alpha | varchar(15) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+
添加记录
mysql> insert into t values('"1,000,000"'); Query OK, 1 row affected (0.00 sec) mysql> select * from t; +-------------+ | alpha | +-------------+ | "1,000,000" | +-------------+
更新声明。
mysql> update t set alpha = replace( replace(alpha, ',', ''), '"', '' ); Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t; +---------+ | alpha | +---------+ | 1000000 | +---------+
所以最后我使用的语句是:
UPDATE table
SET field_name = replace( replace(field_name, ',', ''), '"', '' );
我查看了 MySQL Documentation而且看起来我无法使用正则表达式查找并替换。虽然你可以,比如 Eldila ,使用正则表达式进行查找,然后使用替代解决方案进行替换。
还要小心 s/"(\d+),(\d+)"/$1$2/
因为如果数字多于一个逗号,例如 "1,000,000"你将要进行全局替换(在 perl 中是 s///g
)。但即使使用全局替换,替换也会从您上次停止的地方开始(除非 perl 不同),并且会错过所有其他逗号分隔的组。一个可能的解决方案是使第一个 (\d+) 像这样 s/(\d+)?,(\d+)/$1$2/g
是可选的,在这种情况下我需要第二个 find并替换以去除引号。
这里有一些仅作用于字符串“1,000,000”的正则表达式的 ruby 示例,注意字符串中没有双引号,这只是数字本身的字符串。
>> "1,000,000".sub( /(\d+),(\d+)/, '\1\2' )
# => "1000,000"
>> "1,000,000".gsub( /(\d+),(\d+)/, '\1\2' )
# => "1000,000"
>> "1,000,000".gsub( /(\d+)?,(\d+)/, '\1\2' )
# => "1000000"
>> "1,000,000".gsub( /[,"]/, '' )
# => "1000000"
>> "1,000,000".gsub( /[^0-9]/, '' )
# => "1000000"
关于mysql - 从 MySQL 中的字符串中删除引号和逗号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7917/