2013-06-03 93 views
3

如果有公寓號碼,我需要搜索地址字段並將一個字符更改爲大寫。因此'521主街#3b'將變成'521主街#3B'。查找和替換字符的想法

我知道這樣做的方式是編寫一個循環遍歷記錄集的程序,查看最後一個字符的地址字段以查看它是否是一個字母,如果它之前的字符是數字,則更改最後一個字符的情況並更新記錄。

這是什麼東西,會更快/更簡單的正則表達式(還沒有使用過)? 如果是這樣,這最好是從一個編程環境或使用文本編輯器,如Textmate或vi?數據在MySQL和Excel中,但我可以將其導出到文本文件。

謝謝。

+0

我對速度不是很好,但是如何選擇只記錄最後一個字符的記錄呢?然後遍歷該集合,並使每個最後的字符'.toUpper'? – Grant

+0

記錄數量(總數/需要更改)可能是相關的。 – pnuts

+0

記錄集中總共#約8000; 4000-6000需要更改。 – hadenp

回答

2

如果數據存儲在MySQL,那麼最好是在那裏處理它:

UPDATE addresses 
    SET address = CONCAT(LEFT(address, CHAR_LENGTH(address) - 1), UPPER(RIGHT(address, 1))) 
    WHERE address REGEXP BINARY '#[[:digit:]]+[[:lower:]]{1}$' 
; 

我添加BINARY否則REGEXP是不區分大小寫,但BINARY可能需要省略支持多字節字符串。在這種情況下,會進行剩餘更新,但結果無論如何都是正確的。

P. S.該值受到影響,以及它們如何影響了SQL小提琴顯示一個例子:http://sqlfiddle.com/#!2/b29326/1

+0

我運行了這個mysql> UPDATE attRegex SET address = CONCAT(LEFT(address,CHAR_LENGTH(address)-1),UPPER(RIGHT(address,1)))WHERE address REGEXP BINARY'#[[:digit:]] + [ [:低:]] {1} $'; 查詢OK,0行受影響(0.00秒) 匹配的行數:0更改:0警告:0 – hadenp

+0

在SQL小提琴上新增了一個示例。 – Olexa

+0

感謝此代碼和漂亮的示例Olexa,但它隻影響第一條記錄。如何針對整個表運行SQL?我是否需要在PHP中編寫一個程序(例如)並循環記錄,或者有另一種方式使其成爲「多行」? – hadenp

3

我解決了這個使用的TextMate,一旦我開始明白一點正則表達式,很簡單。 (詳情Regex Syntax for making the last character Uppercase in TextMate

不過,我不知道像sed或awk這樣的東西(我開始嘗試)可能是更好的工具。而Olexa提供的SQL解決方案工作。我只是不知道如何使它適用於整個記錄集。

+0

在我的示例中,只更新了第一條記錄,因爲只有最後一個帶小寫字母的公寓號。 :) – Olexa

+0

嗨Olexa,你會嘗試在SQL小提琴更新2-3記錄W /小寫?我編輯了模式,但它只更新了一個模式。感謝您的幫助! – hadenp