2011-03-16 6 views
12

एक सुंदर सीधे आगे SSIS पैकेज है:लघु उद्योगों - फ्लैट फ़ाइल हमेशा एएनएसआई कभी नहीं UTF-8 एन्कोडेड

  • OLE DB स्रोत के लिए एक दृश्य के माध्यम से डेटा प्राप्त करने के लिए, (db तालिका nvarchar में सभी स्ट्रिंग कॉलम या nchar)।
  • मौजूदा तिथि को प्रारूपित करने के लिए व्युत्पन्न कॉलम और इसे डेटासेट पर जोड़ें, (डेटा प्रकार DT_WSTR)।
  • डेटासेट को विभाजित करने के लिए मल्टीकास्ट कार्य:
    • पंक्तियों को "संसाधित" के रूप में अद्यतन करने के लिए ओएलई डीबी कमांड।
    • फ्लैट फ़ाइल गंतव्य - जिस कनेक्शन प्रबंधक को कोड पृष्ठ 65001 यूटीएफ -8 पर सेट किया गया है और यूनिकोड अनचेक किया गया है। सभी स्ट्रिंग कॉलम DT_WSTR पर मैप करें।

हर मैं इस पैकेज नोटपैड में ++ अपने एएनएसआई एक खुला फ्लैट फ़ाइल, कभी नहीं UTF-8 चलाते हैं। अगर मैं यूनिकोड विकल्प की जांच करता हूं, तो फ़ाइल यूसीएस -2 लिटिल एंडियन है।

क्या मैं कुछ गलत कर रहा हूं - मैं फ्लैट फ़ाइल को यूटीएफ -8 एन्कोडेड कैसे प्राप्त कर सकता हूं?

धन्यवाद

+0

ठीक है - ऐसा लगता है कि [SQL सर्वर फ़ोरम] पर एक स्वीकार्य कार्य मिल गया है (http://social.msdn.microsoft.com/forums/en-us/sqlintegrationservices/thread/9B68C357-A5B4-47BF-8EFD -A05945210CA2)। अनिवार्य रूप से मुझे दो यूटीएफ -8 टेम्पलेट फाइलें बनाना था, उन्हें अपने गंतव्य पर कॉपी करने के लिए फ़ाइल कार्य का उपयोग करना था, फिर सुनिश्चित करें कि मैं ओवरराइटिंग के बजाय डेटा जोड़ रहा था। – Neil

+1

अपने प्रश्न का उत्तर देने के लिए स्वतंत्र महसूस करें और फिर इसे चिह्नित करें। – Sam

उत्तर

0

ठीक है - लग रहा था SQL Server Forums पर एक स्वीकार्य काम के आसपास पाया है। अनिवार्य रूप से मुझे दो यूटीएफ -8 टेम्पलेट फाइलें बनाना था, उन्हें अपने गंतव्य पर कॉपी करने के लिए फ़ाइल कार्य का उपयोग करना था, फिर सुनिश्चित करें कि मैं ओवरराइटिंग के बजाय डेटा जोड़ रहा था।

20

स्रोत में -> एडवांस संपादक -> घटक गुण - करने के लिए 65001 AlwaysUseDefaultCodePage करने के लिए> डिफ़ॉल्ट सेट कोड पृष्ठ सच

तब स्रोत> एडवांस संपादक -> इनपुट और आउटपुट गुण चेक बाहरी कॉलम में प्रत्येक स्तंभ और आउटपुट कॉलम और जहां भी संभव हो, 65001 को कोडपेज सेट करें।

यही है।

जिस तरह से एक्सेल फ़ाइल के अंदर डेटा को यूटीएफ - 8 के रूप में परिभाषित नहीं कर सकता है। एक्सेल सिर्फ एक फ़ाइल हैंडलर है। आप नोटपैड का उपयोग कर सीएसवी फाइल भी बना सकते हैं। जब तक आप यूटीएफ -8 के साथ सीएसवी फ़ाइल भरें तो आपको ठीक होना चाहिए।

+2

स्रोत में -> अग्रिम संपादक -> घटक गुण -> डिफ़ॉल्ट कोड पृष्ठ को 65001 पर हमेशा उपयोग करें, डिफ़ॉल्ट URL पृष्ठ को सही करने के लिए, इस चरण ने मुझे डबल कोडपृष्ठ संदर्भ त्रुटि की तलाश करने में घंटों को बचाने में मदद की – BigChief

+1

ध्यान दें कि यह NVARCHAR (MAX) कॉलम के साथ काम नहीं करता है , लेकिन यह काम करता है यदि आपकी क्वेरी NVARCHAR (4000) पर जाती है। यदि आपकी क्वेरी के लिए फ़ील्ड में 4000 वर्णों की आवश्यकता है, तो स्क्रिप्ट घटक या अन्य समाधानों में से एक को आज़माएं। – NYCdotNet

5

उत्तर देने के लिए स्पष्टीकरण जोड़ा जा रहा है ...

65001 करने के लिए कोड पृष्ठ पर स्थापित करने (लेकिन फ़ाइल स्रोत पर यूनिकोड चेकबॉक्स को चेक नहीं करते हैं), एक UTF-8 फ़ाइल बनाने चाहिए। (हाँ, आंतरिक रूप से डेटा प्रकार भी nvarchar होना चाहिए, आदि)।

लेकिन एसएसआईएस से उत्पादित फ़ाइल में बीओएम हेडर (बाइट ऑर्डर मार्कर) नहीं है, इसलिए कुछ प्रोग्राम मान लेंगे कि यह अभी भी ASCII है, यूटीएफ -8 नहीं। मैंने इसे एमएस कर्मचारियों द्वारा MSDN पर पुष्टि की है, साथ ही परीक्षण द्वारा पुष्टि की है।

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

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

4

मैं हाल ही में एक समस्या है, जहां हम निम्न एक स्थिति के पार चलो पर काम किया है:

आप एक समाधान एसक्यूएल सर्वर एकता सेवा (विजुअल स्टूडियो 2005) के प्रयोग पर काम कर रहे हैं। आप अपने डेटाबेस से डेटा खींच रहे हैं और परिणामों को यूटीएफ -8 प्रारूप में एक फ्लैट फ़ाइल (सीएसवी) में रखने की कोशिश कर रहे हैं। समाधान पूरी तरह से डेटा निर्यात करता है और विशेष वर्णों को फ़ाइल में रखता है क्योंकि आपने कोड पेज के रूप में 65001 का उपयोग किया है।

हालांकि, जब आप इसे खोलते हैं तो टेक्स्ट फ़ाइल या इसे किसी अन्य प्रक्रिया में लोड करने का प्रयास करते हैं, तो यह कहता है कि फ़ाइल यूटीएफ -8 के बजाय एएनएसआई है। यदि आप नोटपैड में फ़ाइल खोलते हैं और एक सेव करते हैं और एन्कोड को यूटीएफ -8 में बदलते हैं और फिर आपकी बाहरी प्रक्रिया काम करती है लेकिन यह एक कठिन मैनुअल काम है।

मुझे क्या पता चला है कि जब आप फ्लैट फ़ाइल कनेक्शन मैनेजर की कोड पेज प्रॉपर्टी निर्दिष्ट करते हैं, तो यह एक यूटीएफ -8 फ़ाइल उत्पन्न करता है। हालांकि, यह यूटीएफ -8 फ़ाइल का एक संस्करण उत्पन्न करता है जो कुछ जिसे हम बाइट ऑर्डर मार्क कहते हैं, याद करते हैं।

तो यदि आपके पास सीएवी फ़ाइल है जिसमें वर्ण एए है, तो यूटीएफ 8 के लिए बीओएम 0xef, 0xbb और 0xbf होगा। भले ही फ़ाइल में कोई बीओएम नहीं है, फिर भी यह यूटीएफ 8 है।

दुर्भाग्यवश, कुछ पुराने विरासत प्रणालियों में, एप्लिकेशन बीओएम के लिए फाइल के प्रकार को निर्धारित करने के लिए खोज करते हैं। ऐसा प्रतीत होता है कि आपकी प्रक्रिया भी वही कर रही है।

समस्या को हल करने के लिए आप अपने स्क्रिप्ट कार्य में कोड के निम्न भाग का उपयोग कर सकते हैं जिसे निर्यात प्रक्रिया के बाद चलाया जा सकता है।

using System.IO; 

using System.Text; 

using System.Threading; 

using System.Globalization; 

enter code here 

static void Main(string[] args) 
     { 
      string pattern = "*.csv"; 
      string[] files = Directory.GetFiles(@".\", pattern, SearchOption.AllDirectories); 
      FileCodePageConverter converter = new FileCodePageConverter(); 
      converter.SetCulture("en-US"); 
      foreach (string file in files) 
      { 
       converter.Convert(file, file, "Windows-1252"); // Convert from code page Windows-1250 to UTF-8 
      } 
     } 

class FileCodePageConverter 
    { 
     public void Convert(string path, string path2, string codepage) 
     { 
      byte[] buffer = File.ReadAllBytes(path); 
      if (buffer[0] != 0xef && buffer[0] != 0xbb) 
      { 
       byte[] buffer2 = Encoding.Convert(Encoding.GetEncoding(codepage), Encoding.UTF8, buffer); 
       byte[] utf8 = new byte[] { 0xef, 0xbb, 0xbf }; 
       FileStream fs = File.Create(path2); 
       fs.Write(utf8, 0, utf8.Length); 
       fs.Write(buffer2, 0, buffer2.Length); 
       fs.Close(); 
      } 
     } 

     public void SetCulture(string name) 
     { 
      Thread.CurrentThread.CurrentCulture = new CultureInfo(name); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(name); 
     } 
    } 

जब आप पैकेज आप पाएंगे कि नामित फ़ोल्डर में सभी CSV में एक UTF8 प्रारूप है जो बाइट क्रम चिह्न में बदल दिया जाएगा चलेंगे।

इस प्रकार आपकी बाहरी प्रक्रिया निर्यातित सीएसवी फाइलों के साथ काम करने में सक्षम होगी।

आप विशेष फ़ोल्डर के लिए केवल देख रहे हैं ... स्क्रिप्ट कार्य करने के लिए भेज कि चर और एक नीचे का उपयोग ..

 string sPath; 

     sPath=Dts.Variables["User::v_ExtractPath"].Value.ToString(); 

     string pattern = "*.txt"; 

     string[] files = Directory.GetFiles(sPath); 

मुझे आशा है कि इस मदद करता है !!

+0

मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जहां मैं एक लिनक्स टीम में सीएसवी फाइलों को सौंप रहा हूं जो अंततः उन्हें एक MySQL वेयरहाउस में लोड कर देगा। आपका दृष्टिकोण केवल एक ही था जो उनके लिए काम करता था। आपका कोड काम करता है, मैंने केवल पैरामीटरकरण जोड़ा है। एसएसआईएस ऑन-बोर्ड के साथ समस्या के बिना लोड की गई यूटीएफ -8 एन्कोडेड फ़ाइल बनाने का कोई भी प्रयास असफल रहा। – cdonner

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