Я недавно работал над проблемой, когда мы сталкиваемся с такой ситуацией:
Вы работаете над решением, использующим службы интеграции SQL Server (Visual Studio 2005).
Вы извлекаете данные из своей базы данных и пытаетесь поместить результаты в плоский файл (.CSV) в формате UTF-8. Решение отлично экспортирует данные и сохраняет специальные символы в файле, потому что вы использовали 65001 в качестве кодовой страницы.
Тем не менее, текстовый файл, когда вы открываете его или пытаетесь загрузить его в другой процесс, он говорит, что файл ANSI вместо UTF-8. Если вы откроете файл в блокноте и сделаете SAVE AS и измените кодировку на UTF-8, то ваш внешний процесс заработает, но это утомительная ручная работа.
То, что я обнаружил, что когда вы указываете свойство Code Page диспетчера соединений с плоскими файлами, оно генерирует файл UTF-8. Однако он генерирует версию файла UTF-8, в которой отсутствует то, что мы называем Порядком байтов.
Таким образом, если у вас есть файл CSV, содержащий символ AA, спецификация для UTF8 будет 0xef, 0xbb и 0xbf. Несмотря на то, что файл не имеет спецификации, он все еще в формате UTF8.
К сожалению, в некоторых старых устаревших системах приложения ищут спецификацию, чтобы определить тип файла. Похоже, что ваш процесс тоже делает то же самое.
Чтобы обойти эту проблему, вы можете использовать следующий фрагмент кода в своей задаче скрипта, который можно запустить после процесса экспорта.
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);
Надеюсь, это поможет !!