Saltar al contenido

SSIS: archivo plano siempre ANSI nunca codificado en UTF-8

Siéntete en la libertad de divulgar nuestra página y códigos con tus amigos, ayúdanos a aumentar nuestra comunidad.

En Fuente -> Editor avanzado -> Propiedades del componente -> Establecer la página de códigos predeterminada en 65001 AlwaysUseDefaultCodePage en True

Luego Fuente-> Editor avanzado -> Propiedades de entrada y salida Verifique cada columna en columnas externas y columnas de salida y configure CodePage en 65001 siempre que sea posible.

Eso es.

Por cierto, Excel no puede definir los datos dentro del archivo para que sean UTF – 8. Excel es solo un controlador de archivos. También puede crear archivos csv usando el bloc de notas. siempre y cuando llene el archivo csv con UTF-8, debería estar bien.

Añadiendo explicación a las respuestas …

si configura CodePage en 65001 (pero NO marque la casilla de verificación Unicode en la fuente del archivo), debería generar un archivo UTF-8. (sí, los tipos de datos internamente también deben ser nvarchar, etc.).

Pero el archivo que se produce a partir de SSIS no tiene un encabezado BOM (Byte Order Marker), por lo que algunos programas asumirán que sigue siendo ASCII, no UTF-8. He visto esto confirmado por empleados de MS en MSDN, así como confirmado por pruebas.

La solución de archivo adjunto es una forma de evitar esto: al crear un archivo en blanco CON la lista de materiales adecuada y luego agregar datos de SSIS, el encabezado de la lista de materiales permanece en su lugar. Si le dice a SSIS que sobrescriba el archivo, también pierde la lista de materiales.

Gracias por las sugerencias aquí, me ayudó a descubrir el detalle anterior.

Recientemente trabajé en un problema en el que nos encontramos con una situación como la siguiente:

Está trabajando en una solución que utiliza SQL Server Integration Services (Visual Studio 2005). Está extrayendo datos de su base de datos e intentando colocar los resultados en un archivo plano (.CSV) en formato UTF-8. La solución exporta los datos perfectamente y mantiene los caracteres especiales en el archivo porque ha utilizado 65001 como página de códigos.

Sin embargo, el archivo de texto cuando lo abre o intenta cargarlo en otro proceso, dice que el archivo es ANSI en lugar de UTF-8. Si abre el archivo en el bloc de notas y hace un GUARDAR COMO y cambia la codificación a UTF-8 y luego su proceso externo funciona, pero este es un trabajo manual tedioso.

Lo que he encontrado es que cuando especifica la propiedad de la página de códigos del administrador de conexión de archivos planos, genera un archivo UTF-8. Sin embargo, genera una versión del archivo UTF-8 que pierde algo que llamamos marca de orden de bytes.

Entonces, si tiene un archivo CSV que contiene el carácter AA, la lista de materiales para UTF8 será 0xef, 0xbb y 0xbf. Aunque el archivo no tiene BOM, sigue siendo UTF8.

Desafortunadamente, en algunos sistemas heredados antiguos, las aplicaciones buscan la lista de materiales para determinar el tipo de archivo. Parece que su proceso también está haciendo lo mismo.

Para solucionar el problema, puede utilizar el siguiente fragmento de código en su tarea de secuencia de comandos que se puede ejecutar después del proceso de exportación.

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); 
       
  

cuando ejecute el paquete, encontrará que todos los CSV en la carpeta designada se convertirán a un formato UTF8 que contiene la marca de orden de bytes.

De esta manera, su proceso externo podrá trabajar con los archivos CSV exportados.

si está buscando solo una carpeta en particular … envíe esa variable a la tarea del script y use la siguiente …

      string sPath;

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

      string pattern = "*.txt";

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

¡¡Espero que esto ayude!!

Puntuaciones y reseñas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *