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étodoFlatFileInput_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