Niedawno pracował na problem gdzie natknąć sytuacji takiej jak:
pracujesz nad rozwiązaniem pomocą SQL Server Integration Services (Visual Studio 2005). Wyciągasz dane z bazy danych i próbujesz umieścić wyniki w płaskim pliku (.CSV) w formacie UTF-8. Rozwiązanie eksportuje dane doskonale i zachowuje znaki specjalne w pliku, ponieważ użyłeś 65001 jako strony kodowej.
Jednak plik tekstowy po otwarciu lub próbie załadowania go do innego procesu, mówi, że plik ma ANSI zamiast UTF-8. Jeśli otworzysz plik w notatniku i zrobisz ZAPISZ JAKO i zmień kodowanie na UTF-8, a następnie twój zewnętrzny proces działa, ale jest to żmudna praca ręczna.
Co odkryłem, że po określeniu właściwości strony kodowej menedżera połączeń pliku płaskiego, generowany jest plik UTF-8. Generuje jednak wersję pliku UTF-8, który pomija coś, co nazywamy Markerem kolejności bajtów.
Więc jeśli masz plik CSV zawierający znak AA, BOM dla UTF8 będzie 0xef, 0xbb i 0xbf. Mimo że plik nie zawiera specyfikacji materiałowej, nadal jest to kodowanie UTF8.
Niestety, w niektórych starych starszych systemach aplikacje wyszukują zestawienie komponentów, aby określić typ pliku. Wygląda na to, że twój proces również robi to samo.
Aby obejść problem, można użyć następującego kodu w zadaniu skryptu, który można uruchomić po procesie eksportowania.
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);
}
}
kiedy będzie uruchomić pakiet można zauważyć, że wszystkie pliki CSV w wyznaczonym folderze zostaną przekształcone w formacie UTF-8, który zawiera bom.
W ten sposób Twój proces zewnętrzny będzie mógł pracować z eksportowanymi plikami CSV.
jeśli szukasz tylko do określonego folderu ... wysłać tę zmienną do zadania skryptu i używać poniżej jednego ..
string sPath;
sPath=Dts.Variables["User::v_ExtractPath"].Value.ToString();
string pattern = "*.txt";
string[] files = Directory.GetFiles(sPath);
Mam nadzieję, że to pomoże !!
OK - wydawało się, że znalazło akceptowalne podejście do pracy na [forach SQL Server] (http://social.msdn.microsoft.com/forums/sqlintegrationservices/thread/9B68C357-A5B4-47BF-8EFD -A05945210CA2). Zasadniczo musiałem utworzyć dwa pliki szablonów UTF-8, użyć zadania Plik, aby skopiować je do miejsca docelowego, a następnie upewnić się, że dodawałem dane, zamiast nadpisywać. – Neil
Możesz odpowiedzieć na swoje pytanie, a następnie oznaczyć je. – Sam