[英]Export resultset from MySql as Tab delimited file. Strings with commas in them are getting Quotes around the string, why?
[英]Remove Quotes and Commas from a String in MySQL
我正在從CSV
文件導入一些數據,大於1000
數字變成1,100
等。
從這里刪除引號和逗號的好方法是什么,所以我可以將它放入int
字段?
編輯:
數據實際上已經在MySQL表中,所以我需要能夠使用SQL。 抱歉,混合。
我的猜測是,因為數據能夠導入該字段實際上是varchar或某個字符字段,因為導入到數字字段可能已失敗。 這是一個測試用例,我純粹是一個MySQL,SQL解決方案。
該表只是一個varchar的列(alpha)。
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, ',', ''), '"', '' );
我查看了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
你可能需要稍微玩一下,但它應該可以解決問題。
我的命令確實刪除了所有','和'“'。
為了更嚴格地轉換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的回答有一個問題:他們刪除整個文件中的所有引號和逗號。
當我必須做這樣的事情時,我通常做的是首先用制表符替換所有分隔引號和(通常)分號。
由於我知道我的受影響的值將在哪一列,然后進行另一次搜索並替換:
...給出逗號的值在第三列。
您需要以“^”開頭,以確保它從一行的開頭開始。 然后重復([0-9] +)\\ t,因為有些列只是你想要保留原樣。
([0-9] +),([0-9] +)搜索有數字的值,然后是逗號,然后搜索另一個數字。
在替換字符串中,我們使用\\ 1和\\ 2來保留編輯行中的值,用\\ t(制表符)將它們分開。 然后我們把\\ 3 \\ 4(之間沒有標簽)把數字的兩個組成部分放在一起,而不是逗號。 之后的所有值都將保持不變。
如果您需要使用分號分隔元素,則可以繼續使用分號替換選項卡。 然而 - 如果你省略引號 - 你必須確保文本值本身不包含任何分號。 這就是為什么我更喜歡使用TAB作為列分隔符。
我通常在支持RegExp的普通文本編輯器(EditPlus)中執行此操作,但是可以在任何編程語言中使用相同的regexp。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.