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