txt que por lotes instrucción importar exportar ejemplos delimitador archivo sql-server sql-server-2008 utf-8 ssis flat-file

sql server - que - ¿Por qué SSIS no reconoce el delimitador de fila de alimentación de línea{LF} al importar el archivo sin formato UTF-8?



que es bcp sql (3)

Porque:

SSIS no puede leer el archivo y muestra la siguiente advertencia debido al delimitador de la columna Ç ( "c" con cedilla ) y not debido al delimitador de línea {LF} ( Avance de línea ).

[Read flat file [1]] Warning: The end of the data file was reached while reading header rows. Make sure the header row delimiter and the number of header rows to skip are correct.

Aquí hay un paquete de SSIS de muestra que muestra cómo resolver el problema usando el Script Component y al final hay otro ejemplo que simula su problema.

Resolución:

El siguiente paquete de muestra está escrito en SSIS 2008 R2 . Lee un archivo plano con el delimitador de fila {LF} como un único valor de columna; luego divide los datos utilizando el Script Component para insertar la información en una tabla en la base de datos de SQL Server 2008 R2 .

Use Notepad++ para crear un archivo plano simple con pocas filas. El siguiente archivo de muestra tiene información de Id. De producto y Precio de lista en cada fila separada por Ç como delimitador de columna y cada fila termina con el delimitador {LF} .

En el Bloc de notas ++, haga clic en Encoding y luego haga clic Encoding in UTF-8 para guardar el archivo plano en la UTF-8 .

El ejemplo utilizará una base de datos de SQL Server 2008 R2 llamada Sora . Cree una nueva tabla llamada dbo.ProductListPrice utilizando el siguiente script. SSIS insertará los datos del archivo plano en esta tabla.

USE Sora; GO CREATE TABLE dbo.ProductListPrice ( ProductId nvarchar(30) NOT NULL , ListPrice numeric(12,2) NOT NULL ); GO

Cree un paquete SSIS utilizando Business Intelligence Development Studio (BIDS) 2008 R2 . Nombre el paquete como SO_6268205.dtsx . Cree un origen de datos llamado Sora.ds para conectarse a la base de datos Sora en SQL Server 2008 R2 .

Haga clic derecho en cualquier lugar dentro del paquete y luego haga clic en Variables para ver el panel de variables. Cree una nueva variable llamada ColumnDelimiter del tipo de datos String en el alcance del paquete SO_6268205 y establezca la variable con el valor Ç

Haga clic derecho en los Connection Managers y haga clic en New Flat File Connection... para crear una conexión para leer el archivo plano.

En la página General del Editor del administrador de conexión de archivos planos , realice las siguientes acciones:

  • Establezca el nombre del administrador de conexión en ProductListPrice
  • Establezca Descripción en Flat file connection manager to read product list price information.
  • Seleccione la ruta del archivo plano. Tengo el archivo en la ruta C:/Siva/StackOverflow/Files/6268205/ProductListPrice.txt
  • Seleccione {LF} del encabezado delimitador de fila
  • Compruebe los Column names in the first data row
  • Haga clic en la página de Columns

En la página Columns del Editor del Administrador de conexión de archivos planos , verifique que el Column delimiter esté en blanco y deshabilitado. Haga clic en la página Advanced .

En la página Advanced del Editor del Administrador de conexión de archivos planos , realice las siguientes acciones.

  • Establecer el nombre en LineData
  • Verifique que el delimitador de columna esté establecido en {LF}
  • Establezca el DataType en la Unicode string [DT_WSTR]
  • Establezca el OutputColumnWidth en 255
  • Haga clic en la página de Preview .

En la página de Preview del editor de Flat File Connection Manager , verifique que los datos mostrados se vean correctos y haga OK en OK .

Verá el origen de datos Sora y el administrador de conexión de archivos planos ProductListPrice en la pestaña Connection Managers en la parte inferior del paquete.

Arrastre y suelte Data Flow Task en la pestaña Flujo de control del paquete y File to database - Without Cedilla delimiter

Haga doble clic en la Tarea de flujo de datos para cambiar la vista a la pestaña Data Flow en el paquete. Arrastre y suelte un Flat File Source en la pestaña Flujo de datos . Haga doble clic en el Origen de archivo plano para abrir el Flat File Source Editor .

En la página Connection Manager del Editor de fuentes de archivos planos , seleccione ProductListPrice Flat File Connection Manager y haga clic en la página Columnas .

En la página Columns del Editor de fuentes de archivo sin LineData , verifique la columna LineData y haga OK en OK .

Arrastre y suelte un Script Component en la pestaña Flujo de datos debajo del Origen de archivo plano , seleccione Transformation y haga OK en OK . Conecte la flecha verde desde el origen de archivo plano al componente de script . Haga doble clic en Script Component para abrir Script Transformation Editor .

Haga clic en Columnas de entrada en el Editor de transformación de script y seleccione la columna LineData . Haga clic en la página Entradas y salidas .

En la página Inputs and Outputs del Editor de transformación de script , realice las siguientes acciones.

  • Cambie el nombre de las entradas a FlatFileInput
  • Cambia el nombre de las salidas a SplitDataOutput
  • Seleccione Columnas de salida y haga clic en Add Column . Repita esto de nuevo para agregar otra columna.
  • Nombra la primera columna ProductId
  • Establezca el DataType de la columna ProductId en la Unicode string [DT_WSTR]
  • Establecer la longitud a 30

En la página Inputs and Outputs del Editor de transformación de script , realice las siguientes acciones.

  • Nombra la segunda columna ListPrice
  • Establezca el DataType de la columna ListPrice en numeric [DT_NUMERIC]
  • Establecer la precisión en 12
  • Establecer la escala en 2
  • Haga clic en la página Script para modificar el script

En la página Script del Editor de transformación de script , realice las siguientes acciones.

  • Haga clic en el botón de puntos suspensivos en ReadOnlyVariables y seleccione la variable User::ColumnDelimiter
  • Haga clic en Edit Script...

Pegue el C # a continuación en el Editor de secuencias de comandos. El script realiza las siguientes tareas.

  • Utilizando el valor delimitador de columna Ç definido en la variable User :: ColumnDelimiter , el método FlatFileInput_ProcessInputRow divide el valor entrante y lo asigna a las dos columnas de salida definidas en la transformación del componente de script.

Código de componente de script en C #

using System; using System.Data; using Microsoft.SqlServer.Dts.Pipeline.Wrapper; using Microsoft.SqlServer.Dts.Runtime.Wrapper; [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] public class ScriptMain : UserComponent { public override void PreExecute() { base.PreExecute(); } public override void PostExecute() { base.PostExecute(); } public override void FlatFileInput_ProcessInputRow(FlatFileInputBuffer Row) { const int COL_PRODUCT = 0; const int COL_PRICE = 1; char delimiter = Convert.ToChar(this.Variables.ColumnDelimiter); string[] lineData = Row.LineData.ToString().Split(delimiter); Row.ProductId = String.IsNullOrEmpty(lineData[COL_PRODUCT]) ? String.Empty : lineData[COL_PRODUCT]; Row.ListPrice = String.IsNullOrEmpty(lineData[COL_PRICE]) ? 0 : Convert.ToDecimal(lineData[COL_PRICE]); } }

Arrastre y suelte OLE DB Destination en la pestaña Flujo de datos . Conecte la flecha verde del componente de script al destino OLE DB . Haga doble clic en OLE DB Destination para abrir OLE DB Destination Editor .

En la página Connection Manager del Editor de destino de OLE DB , realice las siguientes acciones.

  • Seleccione Sora de OLE DB Connection Manager
  • Seleccione Table or view - fast load desde el modo de acceso a datos
  • Seleccione [dbo].[ProductListPrice] en Nombre de la tabla o la vista
  • Haga clic en la página de asignaciones

Haga clic en la página Mappings en el Editor de destino de OLE DB que asignaría automáticamente las columnas si los nombres de las columnas de entrada y salida son los mismos. Haga clic en OK .

La pestaña Flujo de datos debería tener este aspecto después de configurar todos los componentes.

Ejecute la consulta select * from dbo.ProductListPrice en el SQL Server Management Studio (SSMS) para encontrar el número de filas en la tabla. Debe estar vacío antes de ejecutar el paquete.

Ejecutar el paquete. Notarás que el paquete procesó exitosamente 9 filas. El archivo plano contiene 10 líneas, pero la primera fila es el encabezado con nombres de columna.

Ejecute la consulta select * from dbo.ProductListPrice en SQL Server Management Studio (SSMS) para encontrar las 9 filas insertadas correctamente en la tabla. Los datos deben coincidir con los datos de archivos planos.

El ejemplo anterior ilustra cómo dividir manualmente los datos utilizando el componente Script porque el Administrador de conexión de archivos planos encuentra un error cuando se configura el delimitador de columna Ç

Simulación de problemas:

Este ejemplo muestra un Administrador de conexión de archivos planos configurado con el delimitador de columnas Ç , que ejecuta pero encuentra una advertencia y no procesa ninguna línea.

Haga clic derecho en los Connection Managers y haga clic en New Flat File Connection... para crear una conexión para leer el archivo plano. En la página General del Editor del administrador de conexión de archivos planos , realice las siguientes acciones:

  • Establezca el nombre del administrador de conexión en ProductListPrice_Cedilla
  • Establezca Description to Flat file connection manager with Cedilla column delimiter.
  • Tengo el archivo en la ruta C:/Siva/StackOverflow/Files/6268205/ProductListPrice.txt Seleccione la ruta plana del archivo.
  • Seleccione {LF} del encabezado delimitador de fila
  • Compruebe los Column names in the first data row
  • Haga clic en la página de Columns

En la página Columns del Editor del Administrador de conexión de archivos planos , realice las siguientes acciones:

  • Establezca el delimitador de fila en {LF}
  • El campo delimitador de columna puede estar deshabilitado. Haga clic en Reset Columns
  • Poner delimitador de columna en Ç
  • Haga clic en la página Advanced

En la página Advanced del Editor de Connection Manager de archivos planos , realice las siguientes acciones:

  • Establecer el nombre en ProductId
  • Establezca el ColumnDelimiter en Ç
  • Establezca el DataType en la Unicode string [DT_WSTR]
  • Establecer la longitud a 30
  • Haga clic en la columna ListPrice

En la página Advanced del Editor de Connection Manager de archivos planos , realice las siguientes acciones:

  • Establecer el nombre a ListPrice
  • Establezca ColumnDelimiter en {LF}
  • Establezca el DataType en numeric [DT_NUMERIC]
  • Establezca la DataPrecision en 12
  • Establecer la escala de datos a 2
  • Haga clic en OK

Arrastre y suelte una Data Flow task en la pestaña Flujo de control y asígnele el nombre de File to database - With Cedilla delimiter . Deshabilita la primera tarea de flujo de datos.

Configure la segunda tarea de flujo de datos con Flat File Source y OLE DB Destination

Haga doble clic en el Origen de archivo plano para abrir el Flat File Source Editor . En la página Connection Manager del Editor de fuentes de archivos planos , seleccione ProductListPrice_Cedilla Flat File Connection Manager y haga clic en la página Columnas para configurar las columnas. Haga clic en OK .

Ejecutar el paquete. Todos los componentes mostrarán un color verde para indicar que el proceso se realizó correctamente, pero no se procesarán filas. Puede ver que no hay indicación de números de filas entre el Flat File Source y el OLE DB Destination

Haga clic en la pestaña Progress y verá el siguiente mensaje de advertencia.

[Read flat file [1]] Warning: The end of the data file was reached while reading header rows. Make sure the header row delimiter and the number of header rows to skip are correct.

Estoy tratando de importar datos de un archivo plano codificado en utf-8 a SQL Server 2008 mediante SSIS. Así es como se ve el final de la fila en Notepad ++:

Tengo un par de imágenes más que muestran cómo se ve el administrador de conexión de archivos:

Puede ver que los datos se muestran correctamente en la vista previa del administrador de conexión de archivos. Cuando intento importar estos datos, no se importan filas. Recibo un mensaje de error que indica que no se encontró el delimitador de fila. Puede ver en las imágenes del administrador de conexión de archivos que el delimitador de fila del encabezado y el delimitador de fila están configurados en {LF} . Esto fue suficiente para generar la vista previa correcta, por lo que no entiendo por qué no funcionó para importar. He intentado una serie de cosas que han traído cero resultados:

  • Intentado usando la importación del asistente en SSMS ... mismos resultados
  • Intentado utilizando la conversión de datos, sin impacto
  • Intenté configurar el delimitador de fila en (0a), mismos resultados

[Fuente del archivo plano [582]] Advertencia: se alcanzó el final del archivo de datos al leer las filas del encabezado. Asegúrese de que el delimitador de fila de encabezado y el número de filas de encabezado a omitir sean correctos.

Gracias por ver esto y realmente aprecio cualquier ayuda que pueda ofrecer.


Este problema también surge si está intentando consumir FlatFile generado en una plataforma diferente como Unix, Mac, etc. a través de SSIS en Windows

En tal escenario, todo lo que necesita hacer es convertir el formato de archivo de, por ejemplo, UNIX a DOS con el comando unix2dos

unix2dos file-to-convert


La respuesta anterior parece muy complicada, simplemente convierta los finales de línea en el archivo

Dim FileContents As String = My.Computer.FileSystem.ReadAllText("c:/Temp/UnixFile.csv") Dim NewFileContents As String = FileContents.Replace(vbLf, vbCrLf) My.Computer.FileSystem.WriteAllText("c:/temp/WindowsFile.csv", NewFileContents, False, New System.Text.UnicodeEncoding)

Reventado de here