MySQL में एक स्ट्रिंग से उद्धरण और कॉमा हटाएं

मैं CSV फ़ाइल से कुछ डेटा आयात कर रहा हूं, और 1000 से बड़ी संख्या 1,100 आदि में बदल गई है।

इस से उद्धरण और अल्पविराम दोनों को हटाने का एक अच्छा तरीका क्या है, इसलिए मैं इसे int फ़ील्ड में डाल सकता हूं?

Edit:

डेटा वास्तव में पहले से ही एक MySQL तालिका में है, इसलिए मुझे SQL का उपयोग करके इसे सक्षम करने की आवश्यकता है। मिश्रण के लिए खेद है।

0
ro fr bn

7 उत्तर

डैनियल और एल्डिला के जवाब में एक समस्या है: वे पूरी फ़ाइल में सभी उद्धरण और अल्पविराम हटा देते हैं।

मैं आमतौर पर ऐसा करता हूं जब मुझे ऐसा कुछ करना होता है तो पहले सभी अलग-अलग उद्धरणों और (आमतौर पर) अर्धविराम को टैब द्वारा प्रतिस्थापित करना होता है।

  • Search: ";"
  • Replace: \t

चूंकि मुझे पता है कि मेरे प्रभावित मूल्य किस कॉलम में होंगे, फिर मैं एक और खोज करता हूं और प्रतिस्थापित करता हूं:

  • Search: ^([\t]+)\t([\t]+)\t([0-9]+),([0-9]+)\t
  • Replace: \1\t\2\t\3\4\t

... कोमा के साथ मूल्य तीसरे कॉलम में दिया गया है।

यह सुनिश्चित करने के लिए कि आपको एक रेखा की शुरुआत में शुरू होता है, आपको "^" से शुरुआत करने की आवश्यकता है। फिर आप दोहराते हैं ([0-9] +) \ t जितनी बार कॉलम होते हैं जिन्हें आप छोड़ना चाहते हैं।

([0-9] +), ([0-9] +) उन मानों की खोज करता है जहां संख्या है, फिर एक अल्पविराम और फिर एक और संख्या।

प्रतिस्थापन स्ट्रिंग में हम \ 1 और \ 2 का उपयोग केवल मानित लाइन से मान रखने के लिए करते हैं, उन्हें \ t (टैब) से अलग करते हैं। फिर हम एक दूसरे के बाद कॉमा के बिना संख्या के दो घटकों को रखने के लिए \ 3 \ 4 (कोई टैब नहीं) डालते हैं। उसके बाद के सभी मूल्य अकेले रहेंगे।

यदि तत्वों को अलग करने के लिए आपको अर्धविराम रखने के लिए अपनी फ़ाइल की आवश्यकता है, तो आप अर्धविरामों के साथ टैब को चालू और प्रतिस्थापित कर सकते हैं। हालांकि - यदि आप उद्धरण छोड़ देते हैं - आपको यह सुनिश्चित करना होगा कि टेक्स्ट मानों में स्वयं कोई अर्धविराम नहीं होता है। यही कारण है कि मैं टैब को स्तंभ विभाजक के रूप में उपयोग करना पसंद करता हूं।

मैं आमतौर पर इसे एक सामान्य पाठ संपादक (एडिटप्लस) में करता हूं जो RegExp का समर्थन करता है, लेकिन किसी भी प्रोग्रामिंग भाषा में एक ही regexps का उपयोग किया जा सकता है।

0
जोड़ा

आप इस perl कमांड का उपयोग कर सकते हैं।

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

आपको इसके साथ थोड़ा सा खेलना पड़ सकता है, लेकिन यह चाल चलाना चाहिए।

0
जोड़ा

मेरा आदेश सभी ',' और '' 'को हटा देता है।

स्टिंग को "1,000" कड़ाई से कन्वर्ट करने के लिए, आपको निम्न कमांड की आवश्यकता होगी।

Perl -lne 's/"(\d+),(\d+)"/$1$2/; print' file.txt > newfile.txt
0
जोड़ा

वास्तव में nlucaroni, आपका मामला बिल्कुल सही नहीं है। आपके उदाहरण में डबल-कोट्स शामिल नहीं हैं, इसलिए

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

मेरे regex से मेल नहीं खाएगा। इसे प्रारूप "XXX, XXX" की आवश्यकता है। मैं गलत तरीके से मेल खाने के उदाहरण के बारे में नहीं सोच सकता।

निम्नलिखित सभी उदाहरणों में रेगेक्स में डिलीमिनेटर शामिल नहीं होगा:

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

अगर आप काउंटर उदाहरण के बारे में सोच सकते हैं तो कृपया मुझे बताएं।

चीयर्स!

0
जोड़ा

बदले गए प्रश्न का समाधान मूल रूप से वही है।

आपको रेगेक्स के साथ चयन क्वेरी को चलाना होगा जहां खंड।

कुछ पसंद है

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

इन पंक्तियों का पूर्वानुमान, आप निम्न रेगेक्स प्रतिस्थापन एस/"(\ d +), (\ d +)"/$ 1 $ 2/और फिर नए मान के साथ फ़ील्ड को अपडेट करना चाहते हैं।

कृपया जोसेफ पेकोरो को गंभीरता से रखें और किसी भी फाइल या डेटाबेस में बड़े पैमाने पर परिवर्तन करने से पहले बैकअप लें। क्योंकि जब भी आप रेगेक्स करते हैं, तो यदि आप ऐसे मामले हैं जो आप चूक गए हैं तो आप डेटा को गंभीरता से गड़बड़ कर सकते हैं।

0
जोड़ा

नियमित अभिव्यक्तियों के लिए यहां एक अच्छा मामला है। यदि आप आयात (आसान) या बाद में एसक्यूएल आयात उन पात्रों को स्वीकार करते हैं (लगभग उतना आसान नहीं) तो आप डेटा पर एक खोज चला सकते हैं और प्रतिस्थापित कर सकते हैं। लेकिन किसी भी मामले में, आपके पास खोजने और प्रतिस्थापित करने के लिए कई विधियां हैं, चाहे वह संपादक हों, स्क्रिप्टिंग भाषाएं, जीयूआई प्रोग्राम इत्यादि। याद रखें कि आप सभी को ढूंढना और बदलना चाहते हैं। बुरे पात्रों में से।

A typical regular expression to find the comma and quotes (assuming just double quotes) is: (Blacklist)

/[,"]/

Or, if you find something might change in the future, this regular expression, matches anything except a number or decimal point. (Whitelist)

/[^0-9\.]/

उपरोक्त लोगों द्वारा चर्चा की गई है कि हम आपकी सीएसवी फ़ाइल में सभी डेटा नहीं जानते हैं। ऐसा लगता है कि आप CSV फ़ाइल में सभी संख्याओं से अल्पविराम और उद्धरण को हटाना चाहते हैं। लेकिन क्योंकि हम नहीं जानते कि सीएसवी फ़ाइल में और क्या है, हम यह सुनिश्चित करना चाहते हैं कि हम अन्य डेटा दूषित न करें। बस एक खोज/प्रतिस्थापन कर अंधेरे से फ़ाइल के अन्य हिस्सों को प्रभावित कर सकता है।

0
जोड़ा

मेरा अनुमान यह है कि चूंकि डेटा आयात करने में सक्षम था कि फ़ील्ड वास्तव में एक वर्चर या कुछ वर्ण फ़ील्ड है, क्योंकि एक संख्यात्मक क्षेत्र में आयात करना असफल हो सकता है। यहां एक टेस्ट केस था जो मैंने पूरी तरह से एक MySQL, SQL समाधान चलाया।

  1. 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    |       | 
    +-------+-------------+------+-----+---------+-------+
    
  2. 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" | 
    +-------------+
    
  3. 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, ',', ''), '"', '' );

मैंने MySQL दस्तावेज़ीकरण और इसे देखा ऐसा नहीं लगता था कि मैं नियमित अभिव्यक्तियाँ और को प्रतिस्थापित कर सकता हूं। यद्यपि आप एल्डिला , जैसे उपयोग कर सकते हैं एक खोज के लिए एक नियमित अभिव्यक्ति और फिर प्रतिस्थापन के लिए एक वैकल्पिक समाधान।


s/"(\ d +), (\ d +)"/$ 1 $ 2/ से सावधान रहें क्योंकि अगर संख्या में केवल एक ही कॉमा है, उदाहरण के लिए "1,000,000" आप जा रहे हैं वैश्विक प्रतिस्थापन करना चाहते हैं (पेर्ल में s /// g है)। लेकिन वैश्विक प्रतिस्थापन के साथ भी प्रतिस्थापन शुरू होता है जहां आपने पिछली बार छोड़ी थी (जब तक कि पर्ल अलग न हो), और हर दूसरे अल्पविराम से अलग समूह को याद करेंगे। एक संभावित समाधान पहला (\ d +) वैकल्पिक <�कोड> एस/(\ डी +)?, (\ D +)/$ 1 $ 2/g जैसा होगा और इस मामले में मुझे एक दूसरा खोज चाहिए और उद्धरण पट्टी करने के लिए प्रतिस्थापित करें।

यहां "1,000,000" स्ट्रिंग पर कार्यरत नियमित अभिव्यक्तियों के कुछ रूबी उदाहरण दिए गए हैं, ध्यान दें कि स्ट्रिंग के अंदर दोहरे उद्धरण नहीं हैं, यह केवल संख्या की एक स्ट्रिंग है।

>> "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
जोड़ा