2009-01-26 12 views
30

मैं यूनिक्स लाइनब्रेक्स वाले डेटाबेस में .csv फ़ाइल डालने का प्रयास कर रहा हूं। आदेश मैं चला रहा हूँ है:थोक सम्मिलित करें, SQL Server 2000, यूनिक्स लाइनब्रेक्स

BULK INSERT table_name 
FROM 'C:\file.csv' 
WITH 
( 
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 

अगर मैं विंडोज प्रारूप में फाइल लोड काम करता है परिवर्तित, लेकिन मैं अगर यह बचा जा सकता है इस अतिरिक्त कदम करने के लिए नहीं करना चाहती। कोई विचार?

उत्तर

92

मुझे योगदान देने के लिए मजबूर होना पड़ा क्योंकि मुझे एक ही समस्या थी, और मुझे दिन में कम से कम दो बार एसएपी से 2 यूनिक्स फ़ाइलों को पढ़ने की जरूरत है। इसलिए, unix2dos का उपयोग करने के बजाय, मुझे प्रोग्रामिंग के माध्यम से कम मैन्युअल हस्तक्षेप और अधिक स्वचालित के साथ कुछ चाहिए।

जैसा कि ध्यान दिया गया है, चार (10) एसक्यूएल स्ट्रिंग के भीतर काम करता है। मैं एक एसक्यूएल स्ट्रिंग का उपयोग नहीं करना चाहता था, और इसलिए मैंने '' '' + Char (10) + '' '' 'इस्तेमाल किया, लेकिन किसी कारण से, यह संकलित नहीं हुआ।

क्या काम किया है बहुत चालाक था: (ROWTERMINATOR = '0x0A')

समस्या हेक्स के साथ हल के साथ!

उम्मीद है कि यह किसी की मदद करेगा।

+0

धन्यवाद @ रैंडी जे। स्वीकार्य उत्तर बदल दिया क्योंकि यह एक बेहतर समाधान है। –

+0

दुर्भाग्य से यह मेरी यूनिक्स फ़ाइल के लिए काम नहीं करता है जिसे एलएफ के साथ समाप्त कर दिया गया है लेकिन गतिशील एसक्यूएल समाधान ने काम किया है! – samaspin

+0

यह मेरा दिन बचाया, thnx! – RBarryYoung

1

एक विकल्प bcp का उपयोग करना होगा, और लाइन ब्रेक कैरेक्टर के रूप में '\n' के साथ एक नियंत्रण फ़ाइल सेट अप करें।

हालांकि आपने संकेत दिया है कि आप नहीं चाहते हैं, तो unix2dos का उपयोग करने के लिए का उपयोग करने के लिए '\r\n' लाइन ब्रेक के साथ फ़ाइल को प्री-प्रोसेस करने के लिए एक और विकल्प होगा।

अंत में, आप BULK INSERT पर FORMATFILE विकल्प का उपयोग कर सकते हैं। आयात प्रारूप निर्दिष्ट करने के लिए यह एक बीसीपी नियंत्रण फ़ाइल का उपयोग करेगा।

+0

मैंने सोचा था कि बीसीपी मॉड्यूल बुलाया थोक सम्मिलित करें। क्या मै गलत हु? –

+0

यह इनपुट प्रारूप निर्दिष्ट करने के लिए बीसीपी फ़ाइलों का उपयोग करने की क्षमता है। – ConcernedOfTunbridgeWells

0

मुझे लगता है कि दो सामान्य मार्ग हैं जिन्हें लिया जा सकता है: एसक्यूएल स्क्रिप्ट में सीएसवी पढ़ने के लिए कुछ वैकल्पिक तरीका या CSV को पहले से किसी भी तरीके से परिवर्तित कर सकते हैं (बीसीपी, यूनिक्स 2 डीओएस, अगर यह एक चीज का एक बार राजा है, आप शायद आपके लिए फ़ाइल को ठीक करने के लिए अपने कोड संपादक का भी उपयोग कर सकते हैं)।

लेकिन आपको एक अतिरिक्त कदम उठाना होगा!

यदि यह प्रोग्राम किसी प्रोग्राम से लॉन्च किया गया है, तो आप उस प्रोग्राम में लाइन एंडिंग को कन्वर्ट करना चाहेंगे। उस स्थिति में और आप रूपांतरण को स्वयं कोड करने का निर्णय लेते हैं, यहां आपको यह देखने की आवश्यकता है: 1. पंक्ति समाप्त हो सकती है \ n 2. या \ r \ n 3. या यहां तक ​​कि \ r (मैक!) 4. अच्छा दुःख, यह हो सकता है कि कुछ पंक्तियों में \ r \ n और अन्य \ n हो, कोई संयोजन संभव नहीं है जब तक आप नियंत्रित नहीं करते कि CSV

ठीक है, ठीक है। संभावना 4 दूर है। यह ईमेल में होता है, लेकिन यह एक और कहानी है।

13

उन सभी के लिए धन्यवाद जिन्होंने उत्तर दिया है लेकिन मुझे अपना पसंदीदा समाधान मिला।

जब आप SQL सर्वर ROWTERMINATOR = '\ n' बताते हैं तो यह इसका अर्थ विंडोज के तहत डिफ़ॉल्ट पंक्ति टर्मिनेटर के रूप में करता है जो वास्तव में "\ r \ n" (सी/सी ++ नोटेशन का उपयोग करके) होता है। यदि आपकी पंक्ति टर्मिनेटर वास्तव में बस "\ n" है तो आपको नीचे दिखाए गए गतिशील एसक्यूएल का उपयोग करना होगा।

DECLARE @bulk_cmd varchar(1000) 
SET @bulk_cmd = 'BULK INSERT table_name 
FROM ''C:\file.csv'' 
WITH (FIELDTERMINATOR = '','', ROWTERMINATOR = '''+CHAR(10)+''')' 
EXEC (@bulk_cmd) 

क्यों आप यह नहीं कह सकते बल्क सम्मिलित करें ... (ROWTERMINATOR = CHAR (10)) मेरे से परे है। ऐसा लगता है कि आप आदेश के साथ अनुभाग में किसी भी अभिव्यक्ति का मूल्यांकन कर सकते हैं।

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

0

मुझे लगता है कि "ROWTERMINATOR = '\ n'" काम करेगा। मैं एक उपकरण में फ़ाइल खोलने का सुझाव दूंगा जो यह सुनिश्चित करने के लिए "छिपे हुए वर्ण" दिखाता है कि आपको लगता है कि लाइन समाप्त हो रही है। मैं इस तरह की चीजों के लिए नोटपैड ++ का उपयोग करता हूं।

+0

हां, आपको लगता है कि यह काम करेगा। और हमने भी अधिकांश को किया। लेकिन ऐसा नहीं है। '\ n' स्वचालित रूप से '\ r \ n' में बदल दिया गया है, इसलिए अन्य कार्यवाही के लिए आवश्यकताओं को स्वयं एक एलएफ प्राप्त करने के लिए। –

0

यह नीचे आता है। यूनिक्स एलएफ (ctrl-J) का उपयोग करता है, एमएस-डॉस/विंडोज सीआर/एलएफ (ctrl-m/Ctrl-J) का उपयोग करता है।

जब आप यूनिक्स पर '\ n' का उपयोग करते हैं, तो इसका अनुवाद एलएफ चरित्र में किया जाता है। एमएस-डॉस/विंडोज़ पर इसे सीआर/एलएफ में अनुवादित किया जाता है। जब आपका आयात यूनिक्स स्वरूपित फ़ाइल पर चलता है, तो यह केवल एक एलएफ देखता है।इसलिए, फ़ाइल को यूनिक्स 2 डीओएस के माध्यम से चलाने के लिए अक्सर आसान होता है। लेकिन जैसा कि आपने मूल प्रश्न में कहा था, आप यह नहीं करना चाहते हैं (मुझे लगता है कि एक अच्छा कारण है कि आप क्यों नहीं कर सकते)।

आप क्यों नहीं कर सकते हैं:

(ROWTERMINATOR = CHAR(10)) 

शायद क्योंकि जब SQL कोड को पार्स किया जाता है, यह (वामो चरित्र के साथ चार (10) की जगह नहीं है क्योंकि यह पहले से ही एकल उद्धरण में encased है)। या शायद इसका अर्थ इस प्रकार किया जा रहा है:

(ROWTERMINATOR = 
    ) 

क्या होता है जब आप @bulk_cmd की सामग्री को प्रतिबिंबित करते हैं?

2

यह उससे थोड़ा अधिक जटिल है! जब आप SQL सर्वर ROWTERMINATOR = '\ n' बताते हैं तो यह इसका अर्थ विंडोज के तहत डिफ़ॉल्ट पंक्ति टर्मिनेटर के रूप में करता है जो वास्तव में "\ r \ n" (सी/सी ++ नोटेशन का उपयोग करके) है। यदि आपकी पंक्ति टर्मिनेटर वास्तव में बस "\ n" है तो आपको ऊपर दिखाए गए गतिशील एसक्यूएल का उपयोग करना होगा। मैंने बस एक घंटे का सबसे अच्छा हिस्सा बिताया है कि क्यों \ n वास्तव में मतलब नहीं है \ N जब बल्क इन्टरनेट के साथ प्रयोग किया जाता है!

3

मैं पुष्टि करते हैं कि वाक्य रचना

ROWTERMINATOR = '''+CHAR(10)+''' 

काम करता है जब एक EXEC कमांड के साथ इस्तेमाल किया।

आप एक से अधिक ROWTERMINATOR वर्ण है (उदाहरण के एक पाइप और एक यूनिक्स linefeed) तो इस के लिए वाक्य रचना है:

ROWTERMINATOR = '''+CHAR(124)+''+CHAR(10)+''' 
संबंधित मुद्दे