Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中删除字符串中的引号和逗号_Mysql_Regex_String - Fatal编程技术网

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

在MySQL中删除字符串中的引号和逗号,mysql,regex,string,Mysql,Regex,String,我正在从CSV文件导入一些数据,大于1000的数字会变成1100等 有什么好方法可以同时删除引号和逗号,这样我就可以把它放到int字段中 编辑: 数据实际上已经在一个MySQL表中,所以我需要能够使用SQL来实现这一点。很抱歉弄错了。您可以使用这个perl命令 Perl -lne 's/[,|"]//; print' file.txt > newfile.txt 您可能需要对它进行一些操作,但它应该可以做到这一点。以下是PHP的方法: $stripped = str_replace(ar

我正在从
CSV
文件导入一些数据,大于
1000
的数字会变成
1100

有什么好方法可以同时删除引号和逗号,这样我就可以把它放到
int
字段中

编辑:


数据实际上已经在一个MySQL表中,所以我需要能够使用SQL来实现这一点。很抱歉弄错了。

您可以使用这个perl命令

Perl -lne 's/[,|"]//; print' file.txt > newfile.txt
您可能需要对它进行一些操作,但它应该可以做到这一点。

以下是PHP的方法:

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

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)中执行此操作,但在任何编程语言中都可以使用相同的RegExp。

我的命令会删除所有“、”和“”

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

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

事实上,你的案例并不完全正确。你的例子中没有双引号,所以

id,age,name,...
1,23,phil,
与我的正则表达式不匹配。它需要“XXX,XXX”格式。我想不出什么时候匹配不正确的例子

以下所有示例不包括正则表达式中的除沫器:

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


干杯!

这里是正则表达式的一个很好的例子。您可以在导入之前(更容易)或以后(如果SQL导入接受了这些字符,则更容易)对数据运行查找和替换.但在任何一种情况下,您都可以使用多种方法进行查找和替换,例如编辑器、脚本语言、GUI程序等。请记住,您需要查找和替换所有错误字符

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

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


上面的人讨论的是,我们不知道您的CSV文件中的所有数据。听起来您想删除CSV文件中所有数字的逗号和引号。但是因为我们不知道CSV文件中还有什么,我们想确保我们不会损坏其他数据。只是盲目地执行查找/替换操作uld会影响文件的其他部分。

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

您必须使用正则表达式where子句运行select查询

糟糕的

Select *
  FROM SOMETABLE
  WHERE SOMEFIELD REGEXP '"(\d+),(\d+)"'
对于这些行中的每一行,都要执行以下正则表达式替换s/“(\d+),(\d+)/$1$2/,然后用新值更新字段


在对任何文件或数据库进行大规模更改之前,请认真对待Joseph Pecoraro并进行备份。因为无论何时执行regex,如果有遗漏的情况,都会严重弄乱数据。

我的猜测是,因为数据能够导入,所以该字段实际上是一个varchar或某个字符字段,因为rting到一个数字字段可能失败了。下面是一个测试用例,我纯粹运行了一个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, ',', ''), '"', '' );
    
    我看了一下,看起来我不能做正则表达式查找和替换。尽管你可以,比如,使用正则表达式查找,然后使用替换的替代解决方案


    还要注意
    s/“(\d+),(\d+)/$1$2/
    ,因为如果数字的长度超过一个逗号,例如“1000000”,则需要进行全局替换(在perl中,即
    s///g
    ),但即使使用全局替换,替换也从上次停止的位置开始(除非perl不同),并将错过每隔一个逗号分隔的组。一个可能的解决方案是将第一个(\d+)设置为可选,如so
    s/(\d+),(\d+)/$1$2/g
    ,在这种情况下,我需要第二个查找和替换来删除引号

    下面是一些ruby正则表达式的示例,它们只作用于字符串“1000000”,注意字符串中没有双引号,这只是一个数字本身的字符串

    >> "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> 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, ',', ''), '"', '' );
    
    >> "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"