2011-10-20 13 views
41

सभी,पोस्टग्रेस्क्ल में कैरिज रिटर्न और नई लाइनों को कैसे निकालें?

मैं फिर से एक प्रारूप में अपना डेटा प्राप्त करने की कोशिश कर रहा हूं जिसमें मुझे इसकी आवश्यकता है। मेरे पास एक ऐसा टेक्स्ट फ़ील्ड है जो इस तरह दिखता है। अमेरिकी नाम DeAngelo से Italain

अर्थ:

"DeAngelo 001 DeAngelo

नाम के स्थानीय मूल स्वर्गदूतों की

भावनात्मक स्पेक्ट्रम • वह की एक फव्वारा है सभी के लिए खुशी।

व्यक्तिगत अखंडता • उसका अच्छा नाम उसकी मस्तिष्क है टी कीमती संपत्ति। व्यक्तित्व • तुर्की से घिरे हुए ईगल के साथ बढ़ना मुश्किल है! संबंध • धीरे-धीरे शुरू होता है, लेकिन डींगेलो के साथ संबंध समय के साथ बनाता है। यात्रा & अवकाश • जीवन भर की यात्रा अपने भविष्य में है।

कैरियर & पैसा • एक प्रतिभाशाली बच्चा, डीएंजेलो को को लगातार चुनौती देने की आवश्यकता होगी।

जीवन के अवसर • खुशी और खुशी इस धन्य व्यक्ति का इंतजार करती है।

DeAngelo के भाग्यशाली संख्या: 12 • 38 • 18 • 34 • 29 • 16

"

सबसे अच्छा तरीका है Postgresql में क्या होगा कैरिएज रिटर्न और नई लाइनों को हटाने के लिए मैंने? कई चीजें करने की कोशिश की और उनमें से कोई व्यवहार करने के लिए चाहते हैं।

select regexp_replace(field, E'\r\c', ' ', 'g') from mytable 
    WHERE id = 5520805582 

SELECT regexp_replace(field, E'[^\(\)\&\/,;\*\:.\>\<[:space:]a-zA-Z0-9-]', ' ') 
    FROM mytable 
    WHERE field~ E'[^\(\)\&\/,;\*\:.\<\>[:space:]a-zA-Z0-9-]' 
    AND id = 5520805582; 

अग्रिम धन्यवाद, एडम

उत्तर

97
select regexp_replace(field, E'[\\n\\r]+', ' ', 'g') 

मैनुअल http://www.postgresql.org/docs/current/static/functions-matching.html

+14

यदि आप 'ई' उपसर्ग:' '[\ n \ r] +' 'को छोड़ देते हैं तो आप डबल स्लेश से छुटकारा पा सकते हैं। बहुत साफ दिखने वाला, इमो। – jpmc26

+1

'जी' ध्वज क्या करता है? यह मैनुअल में समझाया नहीं गया है ... – Jens

+0

लिंक किए गए दस्तावेज़ में निम्न पाठ शामिल है: '' फ़्लैग पैरामीटर एक वैकल्पिक टेक्स्ट स्ट्रिंग है जिसमें शून्य या अधिक एकल-अक्षर झंडे होते हैं जो फ़ंक्शन के व्यवहार को बदलते हैं। ध्वज मैं केस-असंवेदनशील मिलान निर्दिष्ट करता हूं, जबकि ध्वज जी केवल पहले की तुलना में प्रत्येक मिलान करने वाले सबस्ट्रिंग के प्रतिस्थापन को निर्दिष्ट करता है। तालिका 9-20 में समर्थित झंडे (हालांकि जी नहीं) वर्णित हैं। '' – valgog

25
select regexp_replace(field, E'[\\n\\r\\u2028]+', ' ', 'g') 

मुझे अपना postgres d/b में एक ही समस्या थी, लेकिन सवाल में न्यू लाइन पारंपरिक ascii CRLF नहीं था, यह एक यूनिकोड लाइन विभाजक, चरित्र U2028 था। उपरोक्त कोड स्निपेट उस यूनिकोड भिन्नता को भी कैप्चर करेगा।

अद्यतन ... हालांकि मैं ही कभी ऊपर उल्लिखित वर्ण "जंगली में", का सामना किया है और भी अधिक unicode newline-like वर्ण अनुवाद करने के लिए lmichelbacher की सलाह का पालन करने, इस का उपयोग करें:

select regexp_replace(field, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g') 
+1

आप उस नियमित अभिव्यक्ति के लिए अन्य "न्यूलाइन-वाई" यूनिकोड वर्ण जोड़ना चाहेंगे: http://en.wikipedia.org/wiki/Newline#Unicode – lmichelbacher

10

ओपी विशेष रूप से पूछा regexes के बारे में यह दिखाई देगा क्योंकि कई अन्य पात्रों के साथ-साथ न्यूलाइन के लिए चिंता भी है, लेकिन उन के लिए केवल न्यूलाइन को बाहर निकालना चाहते हैं, आपको किसी रेगेक्स पर जाने की भी आवश्यकता नहीं है।आप बस कर सकते हैं:

select replace(field,E'\n',''); 

मुझे लगता है कि यह एक SQL- मानक व्यवहार है, इसलिए यह सब करने के लिए वापस का विस्तार करना चाहिए, लेकिन शायद Postgres की बहुत जल्द से जल्द संस्करणों। इसके बाद के संस्करण 9.4 और 9.2

5

में मेरे लिए ठीक परीक्षण किया मामला आप से शुरू या स्ट्रिंग के अंत पंक्ति विराम को हटाने की जरूरत है, तो आप इसका उपयोग कर सकते:

UPDATE table 
SET field = regexp_replace(field, E'(^[\\n\\r]+)|([\\n\\r]+$)', '', 'g'); 

मन में है कि टोपी ^ का मतलब है स्ट्रिंग की शुरूआत और डॉलर का संकेत $ स्ट्रिंग का अंत है।

आशा है कि यह किसी की मदद करे।

संबंधित मुद्दे