2010-04-20 14 views
131

मेरे पास एक फ़ाइल है जिसमें संख्यात्मक मानों के 3 से 4 कॉलम हो सकते हैं जो अल्पविराम से अलग होते हैं। खाली फील्ड अपवाद के साथ परिभाषित कर रहे हैं जब वे पंक्ति के अंत में कर रहे हैं:सीएसवी डेटा से MySQL लोड नल मान

1,2,3,4,5 
1,2,3,,5 
1,2,3 

निम्न तालिका MySQL में बनाया गया था:

 
+-------+--------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+-------+--------+------+-----+---------+-------+ 
| one | int(1) | YES |  | NULL |  | 
| two | int(1) | YES |  | NULL |  | 
| three | int(1) | YES |  | NULL |  | 
| four | int(1) | YES |  | NULL |  | 
| five | int(1) | YES |  | NULL |  | 
+-------+--------+------+-----+---------+-------+ 

मैं MySQL लोड आदेश का उपयोग कर डेटा लोड करने के कोशिश कर रहा हूँ :

LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS 
TERMINATED BY "," LINES TERMINATED BY "\n"; 

जिसके परिणामस्वरूप तालिका:

 
+------+------+-------+------+------+ 
| one | two | three | four | five | 
+------+------+-------+------+------+ 
| 1 | 2 |  3 | 4 | 5 | 
| 1 | 2 |  3 | 0 | 5 | 
| 1 | 2 |  3 | NULL | NULL | 
+------+------+-------+------+------+ 

समस्या इस तथ्य के साथ निहित है कि जब कच्चे डेटा में कोई फ़ील्ड खाली होता है और परिभाषित नहीं किया जाता है, तो किसी कारण से MySQL कॉलम डिफ़ॉल्ट मान (जो न्यूल है) का उपयोग नहीं करता है और शून्य का उपयोग करता है। जब क्षेत्र पूरी तरह से गायब हो जाता है तो NULL सही ढंग से उपयोग किया जाता है।

दुर्भाग्यवश, मुझे इस चरण में न्यूल और 0 के बीच अंतर करने में सक्षम होना चाहिए ताकि किसी भी मदद की सराहना की जा सके।

धन्यवाद एस

संपादित

शो चेतावनी के उत्पादन:

 
+---------+------+--------------------------------------------------------+ 
| Level | Code | Message            | 
+---------+------+--------------------------------------------------------+ 
| Warning | 1366 | Incorrect integer value: '' for column 'four' at row 2 | 
| Warning | 1261 | Row 3 doesn't contain data for all columns    | 
| Warning | 1261 | Row 3 doesn't contain data for all columns    | 
+---------+------+--------------------------------------------------------+ 

उत्तर

139

यह तुम क्या चाहते हो जाएगा। यह एक स्थानीय चर में चौथे क्षेत्र पढ़ता है, और उसके बाद शून्य करने के लिए वास्तविक क्षेत्र मूल्य निर्धारित करता है, अगर स्थानीय चर एक खाली स्ट्रिंग युक्त समाप्त होता है:

LOAD DATA infile '/tmp/testdata.txt' 
INTO TABLE moo 
fields terminated BY "," 
lines terminated BY "\n" 
(one, two, three, @vfour, five) 
SET four = nullif(@vfour,'') 
; 

वे सब संभवतः खाली कर रहे हैं, तो आप चाहते उन्हें सभी को वैरिएबल में पढ़ें और इसमें कई एसईटी स्टेटमेंट्स हैं, जैसे:

LOAD DATA infile '/tmp/testdata.txt' 
INTO TABLE moo 
fields terminated BY "," 
lines terminated BY "\n" 
(@vone, @vtwo, @vthree, @vfour, @vfive) 
SET 
one = nullif(@vone,''), 
two = nullif(@vtwo,''), 
three = nullif(@vthree,''), 
four = nullif(@vfour,'') 
; 
+0

क्या इसका प्रदर्शन प्रभाव पड़ता है? – Blacksonic

+0

सैद्धांतिक रूप से, मुझे लगता है - लेकिन यह सभी स्मृति में है, और केवल डेटा की थोड़ी मात्रा है प्रति पंक्ति, इसलिए मैं छवि को infinitesimal होगा, लेकिन अगर आपको लगता है कि यह एक समस्या हो सकती है तो आपको इसका परीक्षण करना चाहिए। –

+2

मुझे यह जवाब वाकई पसंद है। उपयोगकर्ताओं को एक्सेल के लिए 'IFNULL (Col,' ')' में 'IFNULL (Col,' ')' का उपयोग करके एक सीएसवी डाउनलोड करते समय खाली स्ट्रिंग्स '' '' देख सकते हैं, लेकिन तब अपलोड उन्हें शून्य \ n से निपटने के लिए शून्य बनाते हैं। सीएसवी में। धन्यवाद! – chrisan

2

preprocess अपने इनपुट के साथ \ N खाली प्रविष्टियों को बदलने के लिए सीएसवी। एक regex पर

प्रयास: एस/,, /, \ N,/g और एस /, $ /, \ N/जी

गुड लक।

+1

इस regex आंशिक रूप से काम करता है, यह अनुक्रमिक खाली प्रविष्टियों का समाधान नहीं होता है, उदाहरण के लिए ,,,, हो जाएगा, \ N ,, \ N, प्रयोग करने योग्य यदि आप इसे दो बार चलाने के – ievgen

+0

जवाब संक्षेप में प्रस्तुत होना चाहिए और पिछली टिप्पणी। मेरे लिए काम करने के बाद, क्रम में: sed -i//, /, \ N/g '$ फ़ाइल, sed -i' /, /,/g '$ फ़ाइल, sed -i' एस/\ एन, $/\ N/g '$ फ़ाइल, –

95

MySQL manual का कहना है:

जब डेटा लोड INFILE, खाली साथ डाटा पढ़ने या कॉलम नहीं हैं '' के साथ अपडेट किया जाता है। यदि आप कॉलम में एक NULL मान चाहते हैं, तो आपको डेटा फ़ाइल में \ N का उपयोग करना चाहिए। शाब्दिक शब्द "NULL" का उपयोग कुछ परिस्थितियों में भी किया जा सकता है।

तो आप इस तरह के साथ \ N कारतूस की जगह की जरूरत है:

1,2,3,4,5 
1,2,3,\N,5 
1,2,3 
+3

टिप के लिए धन्यवाद - मुझे कच्चे स्रोत डेटा को संपादित करने के लिए संदेह है, लेकिन अगर यह इसके आसपास एकमात्र तरीका है तो मैं इसे आज़माउंगा। – Spiros

+7

मैं आपके संदेह को समझता हूं, कोई भी कच्चे डेटा को संपादित करना पसंद नहीं करता है, यह सही नहीं लगता है। हालांकि, अगर आप इसके बारे में एक मिनट के लिए सोचते हैं, तो नल और खाली स्ट्रिंग के बीच अंतर करने का एक तरीका होना चाहिए। रिक्त प्रविष्टियों को एनयूएलएल में अनुवादित किया जाना चाहिए, आपको खाली स्ट्रिंग के लिए एक विशेष अनुक्रम की आवश्यकता होगी। यह अच्छा होगा कि MySQL को रिक्त प्रविष्टियों का इलाज कैसे करें, हालांकि लोड डेटा इन्फाइल '/tmp/testdata.txt' जैसे कुछ टैबलेट म्यू ट्रेट ब्लैंक नल के रूप में ... – Janci

+2

ठीक है, लेकिन यदि आपके पास फ़ील्ड हैं द्वारा संलग्न: "' '\" "\" "नाम", \ N, "सामान" ' – Jonathon

5

व्यवहार डेटाबेस कॉन्फ़िगरेशन के आधार पर अलग है। सख्त मोड में यह एक त्रुटि को एक चेतावनी फेंक देगा। डेटाबेस कॉन्फ़िगरेशन की पहचान के लिए निम्न क्वेरी का उपयोग किया जा सकता है।

mysql> show variables like 'sql_mode'; 
+0

धन्यवाद! मैं अपने सिर को खरोंच कर रहा था कि काम करने की कोशिश कर रहा हूं क्यों खाली कॉलम के साथ एक सीएसवी आयात करना मैं कल उत्पादन सर्वर पर सफलतापूर्वक आयात किया था, मेरी ब्रांड नई स्थानीय स्थापना पर काम नहीं कर रहा था - यह मेरे मामले में जवाब था! –

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