2012-07-12 9 views
5

में .txt फ़ाइल सीमांकित मैं इसे में स्वरूपित डेटा का एक समूह है कि एक .txt फ़ाइल है कि ऐसा दिखाई देता है:लोड हो रहा है निश्चित-चौड़ाई, अंतरिक्ष mySQL

... 
    1  75175.18  95128.46 
    1 790890.89 795829.16 
    1 875975.98 880914.25 
    8 2137704.37 2162195.53 
    8 2167267.27 2375275.28 
    10 2375408.74 2763997.33 
    14 2764264.26 2804437.77 
    15 2804504.50 2881981.98 
    16 2882048.72 2887921.25 
    16 2993093.09 2998031.36 
    19 3004104.10 3008041.37 
... 

मैं प्रत्येक पंक्ति लोड करने के लिए कोशिश कर रहा हूँ मेरे डेटाबेस में एक तालिका में प्रवेश के रूप में, जहां प्रत्येक कॉलम एक अलग क्षेत्र है। मुझे mySQL को सभी डेटा को ठीक से अलग करने में परेशानी हो रही है। मुझे लगता है कि यह मुद्दा इस तथ्य से आ रहा है कि सभी संख्याओं को एक समान सफेद-अंतरिक्ष राशि से अलग नहीं किया गया है।

LOAD DATA LOCAL INFILE 
'/some/Path/segmentation.txt' 
INTO TABLE clip (slideNum, startTime, endTime) 
SET presID = 1; 


LOAD DATA LOCAL INFILE 
'/some/Path/segmentation.txt' 
INTO TABLE clip 
FIELDS TERMINATED BY ' ' 
LINES TERMINATED BY '\n' 
(slideNum, startTime, endTime) 
SET presID = 1; 

कोई भी विचार कैसे इस काम करने के लिए पाने के लिए:

यहाँ दो प्रश्नों मैं अब तक (मैं भी इन प्रश्नों के कई रूप की कोशिश की है) की कोशिश की है कर रहे हैं?

+0

इसके अलावा, प्रत्येक पंक्ति के आरंभ में सिंगल सफेद स्थान पर ध्यान दें। – bddicken

उत्तर

10

ये वही हैं जिन्हें हम "निश्चित चौड़ाई" रिकॉर्ड कहते हैं और लोड डेटा उनके साथ अच्छी तरह से नहीं खेलती है। विकल्प:

  1. Excel में डेटा को साफ पहले, या केवल 1 स्तंभ के साथ
  2. लोड एक अस्थायी तालिका में डेटा, उस स्तंभ में एक पूरे पाठ पंक्ति धकेल कर। फिर आप अंतिम तालिका में आवश्यक कॉलम को टुकड़ा करने के लिए SUBSTR() और TRIM() का उपयोग कर सकते हैं।
  3. या उपयोगकर्ता चर के साथ (@row) आप इसे लोड डेटा स्टेटमेंट के भीतर कर सकते हैं।
LOAD DATA LOCAL INFILE 
'/some/Path/segmentation.txt' 
INTO TABLE clip 
(@row) 
SET slideNum = TRIM(SUBSTR(@row,1,4)), 
    startTime = TRIM(SUBSTR(@row,5,13)), 
    endTime = TRIM(SUBSTR(@row,18,13)) 
; 
+0

ठीक है, अच्छा। क्या यह प्रश्न बेहतर काम करेगा यदि प्रत्येक मूल्य के बीच केवल एक ही स्थान था? शायद एक ऐसी स्क्रिप्ट लिखना मुश्किल नहीं होगा जिसने अंतर को और अधिक सुसंगत बना दिया हो। – bddicken

+0

आमतौर पर आपको पाठ फ़ाइलों में फ़ील्ड को अलग करने के लिए अल्पविराम, अर्धविराम, टैब, या पाइप ('|') का उपयोग करना चाहिए (सीएसवी = अल्पविराम से अलग मूल्य सबसे आम प्रारूप है)। फिर लोड डेटा उन्हें आसानी से संभाल सकता है। –

+0

वाह, विकल्प 3 (और क्वेरी जो इसके साथ चला गया) पूरी तरह से काम किया, धन्यवाद! – bddicken

0
LOAD DATA 
CHARACTERSET AL32UTF8 
INFILE 'DCF Master 14APR2013 VSPCFM_reduced size.txt' 
INTO TABLE EMPLOYEE3 
(
a = TRIM(SUBSTR(@row,1,11)), 
b = TRIM(SUBSTR(@row,33,38)), 
c = TRIM(SUBSTR(@row,70,86)) 
) 
संबंधित मुद्दे