2010-11-23 7 views
7

मैं एक फ़ाइल लोड करने की कोशिश कर रहा हूं जहां सभी पंक्तियां समान नियमों का उपयोग करती हैं। (एक पंक्ति मान हैडर है)MySQL: उपयोगकर्ता चर में फिक्स्ड-पंक्ति प्रारूप के साथ डेटा कैसे लोड करें

HEADER1 
HEADER2 
....... 

लेकिन unluckily जब मैं डेटा लोड INFILE बयान का उपयोग करने के लिए मैं इस त्रुटि मिलती है कोशिश: त्रुटि कोड: 1409 निश्चित आकार के साथ फ़ाइल से मूल्य लोड नहीं कर सकता परिवर्तनीय पर पंक्तियां।

इस कोड मैंने लिखा है:

USE test; 
DROP TABLE IF EXISTS EXAMPLE_H; 
CREATE TABLE EXAMPLE_H(
    ID CHAR(20), 
    SP CHAR(3), 
    IVA CHAR(11) PRIMARY KEY, 
    NLP CHAR(6), 
    DLP DATE, 
    DUVI DATE, 
    DELP CHAR(30), 
    FILLER CHAR(39), 
    VTLP CHAR(3), 
    FILL CHAR(49) 
); 

LOAD DATA INFILE 'BTILSP.TXT' 
    INTO TABLE test.EXAMPLE_H 
    FIELDS TERMINATED BY '' 
    LINES TERMINATED BY '\n' 
    (ID, SP, IVA, NLP, @var_date_one, @var_date_two, DELP, FILLER, VTLP, FILL) 
    SET DLP = str_to_date(@var_date_one, '%Y%m%d', 
     DUVI = str_to_date(@var_date_two, '%Y%m%d'); 

मैं इस विचार (Ramam Pullella द्वारा टिप्पणी) this page के नीचे पढ़ने था, और मैं एक ही कुछ वेबसाइटों पर समझाया पाया है, लेकिन मैं नहीं समझ सकता मुझे यह त्रुटि क्यों मिल रही है।

यदि मैं @var_date_one और @var_date_two चर का उपयोग नहीं करता हूं, और इसलिए STR_TO_DATE फ़ंक्शन, दिनांक को MySQL आवश्यकता के रूप में प्रस्तुत नहीं किया जाता है - फ़ाइल में दिनांक "20100701" जैसा कुछ है - तब वह फ़ील्ड होगा मैं जो अपेक्षा कर रहा हूं उससे ज़्यादा शून्य या अलग तिथि शामिल है। यदि मैं CHAR (8) द्वारा प्रतिनिधित्व करने के लिए डीएलपी और डीयूवीआई को बदलता हूं, तो यह काम करता है, लेकिन मैं SQL DATE तुलना और समान टूल का उपयोग नहीं करूंगा।

क्या आप कृपया मेरी मदद कर सकते हैं? :) बहुत बहुत धन्यवाद।

संपादित करें:

ऐसा लगता है समस्या, लाइन द्वारा '' समाप्त द्वारा दिया जाता है के बाद से लाइन इस तरह का एक "स्थिर पंक्ति (undelimited)" है। हो सकता है कि इसे किसी अज्ञात कारण के लिए चर के लिए असाइन नहीं किया जा सके, लेकिन यह इस तरह से काम करता है। प्रलेखन कहते हैं:

User variables cannot be used when loading data with fixed-row format because user variables do not have a display width.

कोई भी सुझाव?

पुन: संपादित करें: मैंने उस पृष्ठ के नीचे रयान नेव द्वारा टिप्पणी पढ़ी है। वह चर में पंक्तियों को निश्चित करने के लिए एक चाल देता है:

LOAD DATA LOCAL INFILE '<file name>' INTO TABLE <table> 
(@var1) 
SET Date=str_to_date(SUBSTR(@var1,3,10),'%m/%d/%Y'), 
Time=SUBSTR(@var1,14,8), 
WindVelocity=SUBSTR(@var1,26,5), 
WindDirection=SUBSTR(@var1,33,3), 
WindCompass=SUBSTR(@var1,38,3), 
WindNorth=SUBSTR(@var1,43,6), 
WindEast=SUBSTR(@var1,51,6), 
WindSamples=SUBSTR(@var1,61,4); 

क्या आपको लगता है कि यह करने का एक अच्छा तरीका है? :)

+2

डॉक्स में यह ठीक-लंबाई प्रारूप डेटा के लिए काम नहीं करेगा उल्लेख किया है। सबसे अच्छा, अपनी डालने फ़ाइल को फिर से प्रस्तुत करना है। या इसे वर्चर में बदलें, और बाद में एक प्रकार का कास्टिंग करें। – ajreal

+0

@ajreal: धन्यवाद! कल मैंने आपका जवाब नहीं पढ़ा, लेकिन मैंने अपना प्रश्न संपादित किया और मैंने जो कुछ कहा वह मैंने लिखा :) – Markon

उत्तर

3

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

मैं देख सकते हैं कि MySQL 5.5 मैनुअल का कहना है:

  • User variables cannot be used when loading data with fixed-row format because user variables do not have a display width.

यह भी (न कि पहले पृष्ठ पर) का कहना है:

  • If the FIELDS TERMINATED BY and FIELDS ENCLOSED BY values are both empty (''), a fixed-row (nondelimited) format is used. With fixed-row format, no delimiters are used between fields (but you can still have a line terminator). Instead, column values are read and written using a field width wide enough to hold all values in the field. For TINYINT, SMALLINT, MEDIUMINT, INT, and BIGINT, the field widths are 4, 6, 8, 11, and 20, respectively, no matter what the declared display width is.

के बाद से अपने बयान नहीं 'मैदान से घिरा' और खाली 'है FIELDS द्वारा अनसुलझा ', यही कारण है कि आपके पास एक निश्चित प्रारूप है। और इसलिए आप जो चाहें उतना नहीं कर सकते हैं।


कभी-कभी, डीबीएमएस के बाहर डेटा को मालिश करना आसान होता है - डेटा प्रतिनिधित्व को ठीक करना ऐसा एक ऑपरेशन हो सकता है।मेरे पास प्रोग्राम है जिसे मैं डीबीएलडीएफएमटी कहता हूं जिसे मैंने कुछ सालों से उपयोग नहीं किया है, लेकिन यह विभिन्न प्रकार के संचालन कर सकता है, जैसे दशमलव अंकों को अंतर्निहित दशमलव बिंदुओं के साथ परिवर्तित करना (एक मेनफ्रेम चाल; मूल्य फ़ील्ड 00231 99 हो सकता है, मूल्य 231.99 मूल्य का प्रतिनिधित्व)। यह डेट मैनिप्लेशंस के साथ भी निपट सकता है (जरूरी नहीं कि विशेष रूप से उपयोगकर्ता के अनुकूल नोटेशन का उपयोग करें, लेकिन यह उन समस्याओं से निपटने में सक्षम है जो मुझे मुख्य फ्रेम से यूनिक्स डीबीएमएस में डेटा प्राप्त करने का सामना करना पड़ रहा है - MySQL नहीं; यह तब नहीं था जब मैंने इसे लिखा । कोड मुझे संपर्क करें कि यदि कोई ब्याज की हो सकती है - मेरी प्रोफ़ाइल देखने

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। हालांकि, मैंने इस समस्या को हल किया जैसा कि आप नीचे पढ़ सकते हैं। – Markon

+1

@ मार्कन: ठीक है - तो शायद आपको अपना उत्तर एक उत्तर के रूप में लिखना चाहिए, और उसके बाद आवश्यक देरी के बाद इसे स्वीकार करना चाहिए (3 दिन, लेकिन मुझे यकीन नहीं है कि यह प्रश्न पूछने या अपने स्वयं के सबमिशन से है या नहीं जवाब देने के)। इसके बाद यह प्रश्न के लिए बंद हो जाएगा - यह अनुत्तरित या स्वीकार्य/अपवित्र उत्तर के बिना दिखाई नहीं देगा। –

+0

मुझे अपने प्रश्नों का उत्तर देने का विचार बहुत पसंद नहीं है: पी बीटीडब्ल्यू, मैं अक्सर पूछे जाने वाले प्रश्नों में यह आवश्यक नहीं देख सकता। अगर यह "प्रक्रिया" है, ठीक है, तो अगली बार मैं अपने आप जवाब दूंगा: पी फिर से धन्यवाद :) – Markon

1

मामले में किसी और को इस भर आता है तुम सिर्फ

LOAD DATA LOCAL INFILE '<file name>' INTO TABLE <table> (@var1) SET ...

चलाते हैं FIELDS TERMINATED BY निर्दिष्ट किए बिना, और आपकी फ़ाइल है।। अल्पविराम MySQL डिफ़ॉल्ट रूप से उन पर विभाजित होगा।

ऐसे मामले में आप केवल MySQL को बता सकते हैं कि आपका फ़ील्ड डेलीमीटर कुछ मूर्खतापूर्ण है। उदाहरण के लिए:

FIELDS TERMINATED BY '@@@@@@@@@@@@'

इस तरह पूरे लाइन पहले "कॉलम" यानी अपने उपयोगकर्ता चर में डाल दिया जाता है। इसके बाद आप इसे अपने कोड में शीर्ष पर दिखाए गए अनुसार बिल्कुल उपयोग कर सकते हैं।

यह ध्यान देने योग्य एक स्ट्रिंग सीमांकक MySQL व्यवहार करता है लायक है, तो आप भी
FIELDS TERMINATED BY 'this_string_thoes_not_appear_in_my_file हो सकता है अगर आप चाहते हैं

+0

साझा करने के लिए धन्यवाद! – Markon

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