2011-03-16 27 views
12

tiene una muy sencillo paquete SSIS:SSIS - Lima plana siempre ANSI Nunca codificación UTF-8

  • origen de OLE DB para obtener datos a través de una vista, (todas las columnas de cadena en nvarchar tabla db o nchar).
  • Derived Column para formatear la fecha existente y agregarla al conjunto de datos, (tipo de datos DT_WSTR).
  • Tarea de multidifusión para dividir el conjunto de datos entre:
    • OLE DB Comando para actualizar las filas como "procesadas".
    • Destino de archivo plano: el administrador de conexión está configurado en Código de página 65001 UTF-8 y Unicode está desmarcado. Todas las columnas de cadena se asignan a DT_WSTR.

Cada vez que ejecute este paquete de un proceso abierto el archivo plano en Notepad ++ su ANSI, no UTF-8. Si compruebo la opción Unicode, el archivo es UCS-2 Little Endian.

¿Estoy haciendo algo mal? ¿Cómo puedo hacer que el archivo plano sea codificado en UTF-8?

Gracias

+0

OK - parece haber encontrado una solución aceptable en [SQL Server Forums] (http://social.msdn.microsoft.com/forums/en-us/sqlintegrationservices/thread/9B68C357-A5B4-47BF-8EFD -A05945210CA2). Esencialmente tuve que crear dos archivos de plantilla UTF-8, usar una tarea de archivo para copiarlos a mi destino y luego asegurarme de que estaba agregando datos en lugar de sobrescribirlos. – Neil

+1

No dude en responder a su pregunta y luego márquela. – Sam

Respuesta

0

OK - parecen haber encontrado una solución alternativa aceptable en SQL Server Forums. Esencialmente, tuve que crear dos archivos de plantilla UTF-8, usar una tarea de archivo para copiarlos a mi destino y luego asegurarme de que estaba agregando datos en lugar de sobreescribirlos.

20

En Fuente -> Editor Avanzado -> Propiedades de los componentes - Código> Conjunto de página predeterminado de 65001 AlwaysUseDefaultCodePage a True

Entonces Fuente-> Editor Avanzado -> Propiedades de entrada y salida comprobar cada columna en columnas externas y OutPut Columns y configure CodePage en 65001 siempre que sea posible.

Eso es todo.

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

+2

En origen -> Editor avanzado -> Propiedades de componente -> Establecer la página de códigos predeterminados en 65001 AlwaysUseDefaultCodePage en True, este paso me ayudó a ahorrar horas buscando un error de referencia de página de códigos doble – BigChief

+1

Tenga en cuenta que esto no funciona con columnas NVARCHAR (MAX) , pero funciona si tu consulta se envía a NVARCHAR (4000). Si su consulta requiere> 4000 caracteres en un campo, intente con un componente de script o una de las otras soluciones. – NYCdotNet

5

Adición de explicación de las respuestas ...

establecer la página de códigos a 65001 (pero no activa la casilla de verificación Unicode en el archivo de origen), debe generar un archivo UTF-8. (Sí, los tipos de datos internamente también deben ser nvarchar, etc.).

Pero el archivo que se produce desde SSIS no tiene un encabezado BOM (marcador de orden de bytes), por lo que algunos programas supondrán que todavía es ASCII, no UTF-8. He visto esto confirmado por los empleados de MS en MSDN, y confirmado por las pruebas.

La solución para agregar archivos es una forma de evitar esto: al crear un archivo en blanco CON la lista de materiales adecuada y, a continuación, al 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 los consejos aquí, me ayudó a descubrir los detalles anteriores.

4

recientemente he trabajado en un problema en el que nos encontramos con una situación como la siguiente:

Usted está trabajando en una solución utilizando SQL Server Integration Services (Visual Studio 2005). Está extrayendo datos de su base de datos y tratando de colocar los resultados en un archivo plano (.CSV) en formato UTF-8. La solución exporta los datos perfectamente y conserva 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 que cuando especifica la propiedad 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 omite algo que llamamos Marca de Orden de Byte.

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 viejos sistemas legados, 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 la 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 se va a ejecutar el paquete encontrará que todos los CSV en la carpeta designada serán convertidos en un formato UTF8 que contiene la marca de orden de bytes.

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

si está buscando sólo para carpeta en particular ... enviar esa variable a la tarea de la escritura y el uso por debajo de uno ..

 string sPath; 

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

     string pattern = "*.txt"; 

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

Espero que esto ayude !!

+0

Estoy trabajando en un proyecto en el que estoy entregando archivos CSV a un equipo de Linux que finalmente los cargará en un almacén de MySQL. Tu enfoque fue el único que funcionó para ellos. Tu código funcionó, solo agregué la parametrización. Cualquier intento de crear un archivo codificado en UTF-8 que se cargó sin problemas con los medios integrados de SSIS no fue exitoso. – cdonner