我正在从一个 CSV
文件中导入一些数据,数值大于 1000
的数字会变成类似 1,100
的形式。
有什么好的方法可以去掉引号和逗号,以便将其放入 int
字段中呢?
编辑:
实际上,数据已经在 MySQL 表中了,因此我需要使用 SQL 来完成这个操作。抱歉造成混淆。
The table is just a single column (alpha) that is a varchar.
mysql> desc t;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| alpha | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
Add a record
mysql> insert into t values('"1,000,000"');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t;
+-------------+
| alpha |
+-------------+
| "1,000,000" |
+-------------+
Update statement.
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/
的使用,因为如果数字中有超过一个逗号,例如 "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"
/[,"]/
/[^0-9\.]/
对于变化的问题,解决方案基本上相同。
你需要使用正则表达式的where子句来运行选择查询。
类似以下的语句:
Select *
FROM SOMETABLE
WHERE SOMEFIELD REGEXP '"(\d+),(\d+)"'
Perl -lne 's/[,|"]//; print' file.txt > newfile.txt
你可能需要稍微调整一下,但它应该能解决问题。
我的命令可以删除所有的','和'"'。
为了更严格地转换字符串"1,000",您需要使用以下命令。
Perl -lne 's/"(\d+),(\d+)"/$1$2/; print' file.txt > newfile.txt
实际上,nlucaroni,您的情况并不完全正确。您的示例中没有包含双引号,因此
id,age,name,...
1,23,phil,
不符合我的正则表达式。它需要格式为“XXX,XXX”。我想不出它什么情况下会匹配错误。
所有以下示例都不包括定界符在正则表达式中:
"111,111",234 234,"111,111" "111,111","111,111"
如果您能想到一个反例,请告诉我。
谢谢!
Daniel和Eldila的答案有一个问题:他们删除了整个文件中的所有引号和逗号。
当我需要做类似的事情时,我通常会先将所有分隔引号和(通常)分号替换为制表符。
由于我知道受影响的值将在哪一列,因此我会进行另一个搜索和替换:
... 假设带有逗号的值在第三列。
您需要以“^”开头,以确保它从行首开始。然后,您重复 ([0-9]+)\t 直到您想要保留它们的列数。
([0-9]+),([0-9]+) 搜索具有数字、逗号和另一个数字的值。
在替换字符串中,我们使用\1和\2来保留编辑行中的值,并用\t(制表符)将它们分开。然后我们放置\3\4(没有制表符),将数字的两个组成部分放在一起,不带逗号。之后的所有值都将保持不变。