簡體   English   中英

從MySQL中的字符串中刪除引號和逗號

[英]Remove Quotes and Commas from a String in MySQL

我正在從CSV文件導入一些數據,大於1000數字變成1,100等。

從這里刪除引號和逗號的好方法是什么,所以我可以將它放入int字段?

編輯:

數據實際上已經在MySQL表中,所以我需要能夠使用SQL。 抱歉,混合。

我的猜測是,因為數據能夠導入該字段實際上是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 | +---------+ 

所以最后我使用的聲明是:

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

我查看了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"

這是正則表達式的一個很好的例子。 如果SQL導入接受了這些字符(不那么容易),您可以在導入之前(更容易)或稍后對數據運行查找和替換。 但在任何一種情況下,您都可以使用任意數量的方法進行查找和替換,無論是編輯器,腳本語言,GUI程序等。請記住,您將要查找並替換所有不良字符。

查找逗號和引號(假設只是雙引號)的典型正則表達式是:( 黑名單)

/[,"]/

或者,如果您發現將來可能會發生某些變化,則此正則表達式會匹配除數字或小數點以外的任何內容。 (白名單)

/[^0-9\.]/

上面的人討論的是我們不知道您的CSV文件中的所有數據。 聽起來您想刪除CSV文件中所有數字的逗號和引號。 但是因為我們不知道CSV文件中還有什么,我們希望確保我們不會破壞其他數據。 盲目地進行查找/替換可能會影響文件的其他部分。

你可以使用這個perl命令。

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

你可能需要稍微玩一下,但它應該可以解決問題。

這是PHP的方式:

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

鏈接到W3Schools頁面

我的命令確實刪除了所有','和'“'。

為了更嚴格地轉換sting“1000”,您需要以下命令。

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

實際上nlucaroni,你的情況不太對勁。 您的示例不包含雙引號,因此

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

不符合我的正則表達式。 它需要格式“XXX,XXX”。 我想不出一個錯誤匹配的例子。

以下所有示例都不包括正則表達式中的deliminator:

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

如果你能想到一個反例,請告訴我。

干杯!

改變問題的解決方案基本相同。

您必須使用regex where子句運行select查詢。

有點像

Select *
  FROM SOMETABLE
  WHERE SOMEFIELD REGEXP '"(\d+),(\d+)"'

在這些行的第一行中,您希望執行以下正則表達式替換s /“(\\ d +),(\\ d +)”/ $ 1 $ 2 /然后使用新值更新字段。

請認真對待Joseph Pecoraro並在對任何文件或數據庫進行大規模更改之前進行備份。 因為每當你使用正則表達式時,如果有錯過的情況,你可能會嚴重搞亂數據。

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM