从MySQL中的字符串中删除引号和逗号

时间:2008-08-11 16:28:58

标签: mysql regex string

我正在从CSV文件导入一些数据,而且大于1000的数字会变为1,100等。

从这里删除引号和逗号的好方法是什么,所以我可以把它放到int字段中?

修改:

数据实际上已经存在于MySQL表中,所以我需要能够使用SQL。抱歉,混合。

8 个答案:

答案 0 :(得分:16)

我的猜测是,因为数据能够导入该字段实际上是varchar或某个字符字段,因为导入到数字字段可能已失败。这是一个测试用例,我纯粹是一个MySQL,SQL解决方案。

  1. 该表只是一个varchar的列(alpha)。

    mysql> desc t;
    
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | alpha | varchar(15) | YES  |     | NULL    |       | 
    +-------+-------------+------+-----+---------+-------+
    
  2. 添加记录

    mysql> insert into t values('"1,000,000"');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from t;
    
    +-------------+
    | alpha       |
    +-------------+
    | "1,000,000" | 
    +-------------+
    
  3. 更新声明。

    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 | 
    +---------+
    
  4. 所以最后我使用的陈述是:

    UPDATE table
       SET field_name = replace( replace(field_name, ',', ''), '"', '' );
    

    我查看了MySQL Documentation,看起来我不能正常表达式找到并替换。虽然您可以像Eldila一样使用正则表达式进行查找,然后使用替代解决方案。


    同样要小心s/"(\d+),(\d+)"/$1$2/,因为如果数字只有一个逗号就有多少,例如“1,000,000”你想要进行全局替换(在{{1}的perl中})。但即使有全局替换,替换也会从你最后一次停止的地方开始(除非perl不同),并且会错过其他所有逗号分隔的组。一个可能的解决方案是使第一个(\ d +)可选,如此s///g,在这种情况下,我需要第二个查找和替换来删除引号。

    以下是正则表达式仅作用于字符串“1,000,000”的一些ruby示例,请注意字符串中没有双引号,这只是数字本身的字符串。

    s/(\d+)?,(\d+)/$1$2/g

答案 1 :(得分:2)

这是正则表达式的一个很好的例子。如果SQL导入接受了这些字符(不那么容易),您可以在导入之前(更容易)或稍后对数据运行查找和替换。但在任何一种情况下,您都可以使用任意数量的方法进行查找和替换,无论是编辑器,脚本语言,GUI程序等。请记住,您将要查找并替换 all 坏人物。

查找逗号和引号(假设只是双引号)的典型正则表达式为:(黑名单)

/[,"]/

或者,如果您发现将来可能会发生某些变化,则此正则表达式会匹配除数字或小数点以外的任何内容。 (白名单)

/[^0-9\.]/

上述人员讨论的内容是我们不知道您的CSV文件中的所有数据。听起来您想删除CSV文件中所有数字的逗号和引号。但是因为我们不知道CSV文件中还有什么,我们希望确保我们不会破坏其他数据。盲目地进行查找/替换可能会影响文件的其他部分。

答案 2 :(得分:0)

以下是PHP方式:

$stripped = str_replace(array(',', '"'), '', $value);

Link to W3Schools page

答案 3 :(得分:0)

我的命令会删除所有','和'“'。

为了更严格地转换刺“1000”,您需要以下命令。

Perl -lne 's/"(\d+),(\d+)"/$1$2/; print' file.txt > newfile.txt

答案 4 :(得分:0)

其实nlucaroni,你的情况不太对劲。您的示例不包含双引号,因此

id,age,name,...
1,23,phil,

与我的正则表达式不符。它需要格式“XXX,XXX”。我无法想象它何时会错误匹配的例子。

以下所有示例都不包括正则表达式中的分隔符:

"111,111",234
234,"111,111"
"111,111","111,111"

如果你能想到一个反例,请告诉我。

干杯!

答案 5 :(得分:0)

改变问题的解决方案基本相同。

您必须使用regex where子句运行select查询。

这样的东西
Select *
  FROM SOMETABLE
  WHERE SOMEFIELD REGEXP '"(\d+),(\d+)"'

在这些行的前面,您要执行以下正则表达式替换s /“(\ d +),(\ d +)”/ $ 1 $ 2 /然后使用新值更新字段。

请认真对待Joseph Pecoraro,并在对任何文件或数据库进行大规模更改之前进行备份。因为每当你使用正则表达式时,如果有错过的情况,你就会严重搞乱数据。

答案 6 :(得分:0)

您可以使用此perl命令。

Perl -lne 's/[,|"]//; print' file.txt > newfile.txt

你可能需要稍微玩一下,但它应该可以解决问题。

答案 7 :(得分:-1)

Daniel和Eldila的回答有一个问题:他们删除整个文件中的所有引号和逗号。

当我必须做这样的事情时,我通常做的是首先用制表符替换所有分隔引号和(通常)分号。

  • 搜索:“;”
  • 替换: \ t

由于我知道我的受影响的值将在哪个列中,然后进行另一次搜索并替换:

  • 搜索: ^([\ t] +)\ t([\ t] +)\ t([0-9] +),([0-9] +)\ t
  • 替换: \ 1 \ t \ 2 \ t \ 3 \ 4 \ t

...给出逗号的值在第三列。

您需要以“^”开头,以确保它从一行的开头开始。然后你重复([0-9] +)\ t,因为有些列你只想留下它们。

([0-9] +),([0-9] +)搜索有数字的值,然后是逗号,然后搜索另一个数字。

在替换字符串中,我们使用\ 1和\ 2来保留编辑行中的值,用\ t(制表符)将它们分开。然后我们把\ 3 \ 4(之间没有标签)把数字的两个组成部分放在一起,而不是逗号。之后的所有值都将保持不变。

如果您需要使用分号分隔元素,则可以继续使用分号替换选项卡。然而 - 如果你省略引号 - 你必须确保文本值本身不包含任何分号。这就是为什么我更喜欢使用TAB作为列分隔符。

我通常在支持RegExp的普通文本编辑器(EditPlus)中执行此操作,但可以在任何编程语言中使用相同的正则表达式。