我已經在這裏我們遇到的情況,如下面的一個問題最近工作:
您在使用SQL Server集成服務(Visual Studio 2005中)溶液工作。 您正在從數據庫中提取數據,並嘗試將結果放入UTF-8格式的平面文件(.CSV)中。該解決方案將數據完美地導出並保留文件中的特殊字符,因爲您已使用65001作爲代碼頁。
但是,當您打開文本文件或嘗試將其加載到另一個進程時,它表示該文件是ANSI而不是UTF-8。如果您在記事本中打開文件並執行SAVE AS並將編碼更改爲UTF-8,然後您的外部過程可以工作,但這是一項繁瑣的手動工作。
我發現當您指定Flat文件連接管理器的代碼頁屬性時,它會生成一個UTF-8文件。但是,它會生成一個UTF-8文件的版本,它錯過了我們稱之爲「字節順序標記」的內容。
因此,如果您有包含字符AA的CSV文件,則UTF8的BOM將爲0xef,0xbb和0xbf。即使該文件沒有BOM,它仍然是UTF8。
不幸的是,在一些舊的遺留系統中,應用程序搜索BOM以確定文件的類型。看來你的過程也是這樣做的。
要解決該問題,您可以在腳本任務中使用以下代碼片段,該代碼片段可以在導出過程後運行。
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格式。
通過這種方式,您的外部進程將可以使用導出的CSV文件。
,如果你只是在尋找特定的文件夾...發送變量腳本任務,並使用下面的..
string sPath;
sPath=Dts.Variables["User::v_ExtractPath"].Value.ToString();
string pattern = "*.txt";
string[] files = Directory.GetFiles(sPath);
我希望這有助於!
確定 - 在[SQL Server論壇]上似乎找到了可以接受的解決方法(http://social.msdn.microsoft.com/forums/en-us/sqlintegrationservices/thread/9B68C357-A5B4-47BF-8EFD -A05945210CA2)。 本質上,我必須創建兩個UTF-8模板文件,使用文件任務將它們複製到我的目標,然後確保我正在追加數據而不是覆蓋。 – Neil
隨時回答你的問題,然後標記它。 – Sam