我正在从CSV
文件中导入一些数据,并且大于1000
get的数字会变成1,100
等等.
从这里删除引号和逗号的好方法是什么,所以我可以把它放到一个int
字段中?
编辑:
数据实际上已经在MySQL表中,所以我需要能够使用SQL.抱歉,混合.
我的猜测是,因为数据能够导入该字段实际上是varchar或某个字符字段,因为导入到数字字段可能已失败.这是一个测试用例,我纯粹是一个MySQL,SQL解决方案.
该表只是一个varchar的列(alpha).
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文档,它看起来不像我可以做正则表达式查找和替换.虽然你可以像Eldila一样,使用正则表达式进行查找,然后使用替代解决方案.
另外要小心,s/"(\d+),(\d+)"/$1$2/
因为如果数字只有一个逗号就有多少,例如"1,000,000"你将要进行全局替换(在perl中s///g
).但即使有全局替换,替换也会从你最后一次停止的地方开始(除非perl不同),并且会错过其他所有逗号分隔的组.一个可能的解决方案是使第一个(\ d +)可选,就像这样s/(\d+)?,(\d+)/$1$2/g
,在这种情况下,我需要第二个查找和替换来剥离引号.
以下是一些正则表达式仅作用于字符串"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"