Ste*_*ard 15 regex mysql string
我正在从CSV文件中导入一些数据,并且大于1000get的数字会变成1,100等等.
从这里删除引号和逗号的好方法是什么,所以我可以把它放到一个int字段中?
编辑:
数据实际上已经在MySQL表中,所以我需要能够使用SQL.抱歉,混合.
Jos*_*aro 16
我的猜测是,因为数据能够导入该字段实际上是varchar或某个字符字段,因为导入到数字字段可能已失败.这是一个测试用例,我纯粹是一个MySQL,SQL解决方案.
该表只是一个varchar的列(alpha).
mysql> desc t;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| alpha | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)添加记录
mysql> insert into t values('"1,000,000"');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t;
+-------------+
| alpha |
+-------------+
| "1,000,000" |
+-------------+
Run Code Online (Sandbox Code Playgroud)更新声明.
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 |
+---------+
Run Code Online (Sandbox Code Playgroud)所以最后我使用的声明是:
UPDATE table
SET field_name = replace( replace(field_name, ',', ''), '"', '' );
Run Code Online (Sandbox Code Playgroud)
我查看了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"
Run Code Online (Sandbox Code Playgroud)
这是正则表达式的一个很好的例子。您可以在导入之前(更容易)或稍后(如果 SQL 导入接受这些字符)对数据运行查找和替换(不太容易)。但无论哪种情况,您都可以使用多种方法来进行查找和替换,无论是编辑器、脚本语言、GUI 程序等。请记住,您将需要查找并替换所有错误字符。
查找逗号和引号(假设只有双引号)的典型正则表达式是:(Blacklist)
/[,"]/
Run Code Online (Sandbox Code Playgroud)
或者,如果您发现将来可能会发生变化,则此正则表达式会匹配除数字或小数点之外的任何内容。(白名单)
/[^0-9\.]/
Run Code Online (Sandbox Code Playgroud)
上面的人讨论的是我们不知道您的 CSV 文件中的所有数据。听起来您想从 CSV 文件中的所有数字中删除逗号和引号。但由于我们不知道 CSV 文件中还包含哪些内容,因此我们希望确保不会损坏其他数据。只是盲目地进行查找/替换可能会影响文件的其他部分。