昨天早上发现日志中有错误信息:Integer到String类型转换异常。

由于程序问题,导致数据库中的varchar列存入的json字符串不符合要求,这些json字符串在反序列化成Map<String,String>之后就会报错。

现在要修改不合法数据。比如goods表的desc列

//当前格式
{"name":"aaa","age":24,"height":1.73}
{"name":"bbb","age":30,"weight":65.20}

//目标格式
{"name":"aaa","age":"24","height":"1.73"}
{"name":"bbb","age":"30","weight":"65.20"}



1、如何查出有问题的数据?

因为json数据并不规范,直接使用like查询不太现实,主要是分支有点多。

数据的共同问题就是数字没有被引号包围。所以只需要查出冒号:之后直接是数字的数据

查询MysqL的文档之后,使用如下SQL查询:

select * from goods where desc regexp ':[[:digit:]]+'

select * from goods where desc regexp ':[[:digit:]]+\\,'
这个没用

MysqL的正则表达式跟perl、unix风格的有较大的差异。其中[[:digit:]]表示数字。 \\,用来匹配json中的逗号

2、如何修改有问题的数据?

直接用MysqL修改?那就要把符合条件的数字(组)提取出来,粗略查了下文档,没查到,放弃。

用UE(UltraEdit)编辑器修改。UE支持三种正则表达式:Perl、Unix、和UE。
如何查询?以前常用Unix风格的正则表达式查询没问题,UE风格正则请参考文档,有点弱。
如何替换?这才最关键。要替换就得提取匹配的组。如何提取?UE的帮助文档如是说:

^(*^)
在表达式加上括号或标签在替换命令中使用。正则表达式中可以有 9 个表达式标签,数字根据它们在正则表达式中的次序确定数字。

相应的替换表达式是 ^x,x 的范围是 1-9。例如: 如果 ^(h*o^) ^(f*s^) 匹配“hello folks”,那么^2 ^1 表示将用“folks hello”替换它。


也就是说,用^(*^) 这货来查找,用^1引用第一个组,^2引用第二个组。 例子里,^2引用了folks,^1引用了hello。


对于我遇到的问题

首先,要匹配数字,最简单的[0-9],+表示至少1个,++表示0个或多个,[.]匹配小数点。所以匹配整数和小数可以用[0-9]+[.]++[0-9]++。因为后面要提取数字,所以用^([0-9]+[.]++[0-9]++^)

其次,出错的数据都是冒号后面直接带数字。所以表达式为:^([0-9]+[.]++[0-9]++^)。这样就把正确数据和错误数据区分了。

再次,如果要匹配key比如age、weight,用^("[~"]+"^):^([0-9]+[.]++[0-9]++^)[~"]匹配引号以外的字符。这样的话,想干点什么就方便多了,比如根据json生成表格。

然后,打开查找对话框,选中正则表达式,点开高级,选正则表达式引擎为UltraEdit,查找表达式^("[~"]+"^):^([0-9]+[.]++[0-9]++^),替换表达式^1 :"^2",点击替换。 最后,替换完了,使用列编辑模式生成udpate语句,带上where条件和结束符;最后交给客户端批量执行。 几百条数据有问题,如果自己手工改,肯定早就改完了。不过掌握此种方法,以后类似的问题就容易多了。

使用正则表达式快速修改mysql中错误的varchar类型数据的更多相关文章

  1. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios – 使用大写符号在字符串swift中获取URL的正则表达式

    我尝试在文本中获取URL.所以,在此之前,我使用了这样一个表达式:但是当用户输入带有大写符号的URL时(例如Http://Google.com,它与它不匹配)我遇到了问题.我试过了:但什么都没发生.解决方法您可以使用正则表达式中的i内联标志关闭区分大小写,有关可用正则表达式功能的详细信息,请参阅FoundationFrameworkReference.(?ismwx-ismwx)Flagsetti

  3. ios – 如何在Swift 3中使用正则表达式?

    解决方法我相信.当没有其他选项适用时,将使用.allZeros.因此,使用Swift3,您可以传递一个空的选项列表或省略options参数,因为它默认为无选项:要么请注意,在Swift3中,您不再使用error参数.它现在抛出.

  4. ios – lldb断点在类目标c中的所有方法

    如何使用lldb在ObjectiveC类中的所有方法上自动设置断点?

  5. 从iOS应用程序发送帖子到PHP脚本不工作…简单的解决方案就像

    我之前已经做了好几次了但是由于某些原因我无法通过这个帖子…我尝试了设置为_POST且没有的变量的PHP脚本……当它们未设置为发布时它工作精细.这是我的iOS代码:这里是PHP的一大块,POST变量不在正确的位置?我想这对于更有经验的开发人员来说是一个相当简单的答案,感谢您的帮助!解决方法$_POST是一个数组,而不是一个函数.您需要使用方括号来访问数组索引:

  6. swift的正则表达式(NSRegularExpression)

    init(_pattern:String){varerror:NSError?

  7. swift 正则表达式运用实例选自《swifter 100个swift开发必备tip 》

  8. Swift截取HTML中的所有图片url

    在Swift中,要从HTML格式的String中截取出所有的img的所有图片url,要截取的url就要匹配url,需要用到正则表达式。

  9. 收藏swift正则表达式的各种验证

    1.验证邮箱classfuncvalidateEmail(email:String)->Bool{varemailString="[A-Z0-9a-z._%-]@[A-Za-z0-9.-]\\.[A-Za-z]{2,4}"varemailPredicate=nspredicate(format:"SELFMATCHES%@",emailString)returnemailPredicate.eva

  10. Swift3.0-正则表达式 &lt;待续&gt;

    贡献者:赵大财博客:https://my.oschina.net/zhaodacaiGitHub:https://github.com/zhaodacai邮箱:zhaodacai@yeah.comQQ:327532817=============================先直接来代码:NSRegularExpression.OptionscaseInsensitive不区分大小写allowC

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部