K R*_*ard 29 sql-server ssis flat-file utf-8 sql-server-2008
我试图使用SSIS将数据从utf-8编码的平面文件导入SQL Server 2008.这就是Notepad ++中行数据的结尾:
我有几个图像显示文件连接管理器的样子:
您可以在文件连接管理器预览中看到数据正确显示.当我尝试导入此数据时,不导入任何行.我收到一条错误消息,指出未找到行分隔符.您可以在文件连接管理器图像中看到标题行分隔符和行分隔符都设置为{LF}
.这足以生成正确的预览,所以我迷失了为什么它无法导入.我尝试了许多结果为零的事情:
[Flat File Source [582]]警告:读取标题行时已到达数据文件的末尾.确保标题行分隔符和要跳过的标题行数是正确的.
感谢您的关注,我非常感谢您提供的任何帮助.
小智 62
SSIS无法读取该文件,并显示以下警告由于列分隔符Ç
("C"与变音符号)和not
由于行定界符{LF}
(换行).
[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.
Run Code Online (Sandbox Code Playgroud)
这是一个示例SSIS包,显示如何使用解决问题Script Component
,最后还有另一个模拟您的问题的示例.
下面的示例包是写的SSIS 2008 R2
.它读取一个带有行分隔符的平面文件{LF}
作为单个列值; 然后使用分割数据Script Component
将信息插入SQL Server 2008 R2
数据库中的表.
使用Notepad ++创建一个包含少量行的简单平面文件.下面的示例文件包含每行的Product Id和List Price信息,Ç
以列分隔符分隔,每行以{LF}
分隔符结尾.
在Notepad ++上,单击Encoding
,然后单击Encoding in UTF-8
以保存平面文件的UTF-8
编码.
该示例将使用SQL Server 2008 R2
名为的数据库Sora
.创建一个dbo.ProductListPrice
使用以下给定脚本命名的新表.SSIS会将平面文件数据插入此表.
USE Sora;
GO
CREATE TABLE dbo.ProductListPrice
(
ProductId nvarchar(30) NOT NULL
, ListPrice numeric(12,2) NOT NULL
);
GO
Run Code Online (Sandbox Code Playgroud)
使用Business Intelligence Development Studio(BIDS)2008 R2创建SSIS包.将包命名为SO_6268205.dtsx
.创建一个名为数据源Sora.ds
连接到数据库Sora
中的SQL Server 2008 R2.
右键单击包内的任何位置,然后单击Variables
以查看变量窗格.在包范围中创建一个名为ColumnDelimiter
data type 的新变量,并使用该值设置变量String
SO_6268205
Ç
右键单击Connection Managers
并单击New Flat File Connection...
以创建连接以读取平面文件.
在" 平面文件连接管理器编辑器"的General
页面上,执行以下操作:
ProductListPrice
Flat file connection manager to read product list price information.
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
{LF}
从标题行分隔符中选择Column names in the first data row
Columns
页面在" 平面文件连接管理器编辑器"的Columns
页面上,验证该文件是否Column delimiter
为空并已禁用.点击Advanced
页面.
在" 平面文件连接管理器编辑器"的Advanced
页面上,执行以下操作.
LineData
{LF}
Unicode string [DT_WSTR]
255
Preview
页面.在" 平面文件连接管理器编辑器 " Preview
页面上,验证显示的数据是否正确并单击.OK
您将在包底部的选项卡上看到数据源Sora和平面文件连接管理器ProductListPriceConnection Managers
.
拖放Data Flow Task
到包的" 控制流"选项卡上并将其命名为File to database - Without Cedilla delimiter
双击" 数据流任务"以将视图切换到Data Flow
程序包上的选项卡.Flat File Source
在" 数据流"选项卡上拖放a .双击平面文件源以打开Flat File Source Editor
.
在" 平面文件源编辑器"的Connection Manager
页面上,选择" 平面文件连接管理器",然后单击" 列"页面. ProductListPrice
在" 平面文件源编辑器"的Columns
页面上,选中该列并单击.LineData
OK
将a拖放Script Component
到Flat File Source下面的Data Flow选项卡上,选择并单击.将绿色箭头从平面文件源连接到脚本组件.双击脚本组件以打开.Transformation
OK
Script Transformation Editor
单击" 脚本转换编辑器"上的" 输入列"并选择LineData
列.单击" 输入和输出"页面.
在" 脚本转换编辑器"的Inputs and Outputs
页面上,执行以下操作.
SplitDataOutput
Add Column
.再次重复此操作以添加另一列.ProductId
Unicode string [DT_WSTR]
30
在" 脚本转换编辑器"的Inputs and Outputs
页面上,执行以下操作.
ListPrice
numeric [DT_NUMERIC]
12
2
在" 脚本转换编辑器"的Script
页面上,执行以下操作.
User::ColumnDelimiter
Edit Script...
在脚本编辑器中粘贴以下C#.该脚本执行以下任务.
Ç
变量User :: ColumnDelimiter中定义的列分隔符值,该方法FlatFileInput_ProcessInputRow
将传入的值拆分并将其分配给脚本组件转换中定义的两个输出列.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]);
}
}
Run Code Online (Sandbox Code Playgroud)
拖放OLE DB Destination
到" 数据流"选项卡上.将绿色箭头从脚本组件连接到OLE DB目标.双击OLE DB目标以打开OLE DB Destination Editor
.
在OLE DB目标编辑器的Connection Manager
页面上,执行以下操作.
Sora
从OLE DB连接管理器中选择 Table or view - fast load
从数据访问模式中选择 [dbo].[ProductListPrice]
从表格或视图的名称中选择如果输入和输出列名称相同Mappings
,OLE DB目标编辑器上的单击页面将自动映射列.点击OK
.
配置完所有组件后," 数据流"选项卡应如下所示.
select * from dbo.ProductListPrice
在SQL Server Management Studio(SSMS)中执行查询以查找表中的行数.在执行包之前它应该是空的.
执行包.您会注意到该包已成功处理9行.平面文件包含10行,但第一行是带有列名称的标题.
select * from dbo.ProductListPrice
在SQL Server Management Studio(SSMS)中执行查询以查找成功插入表中的9行.数据应与平面文件数据匹配.
上面的示例说明了如何使用脚本组件手动拆分数据,因为平面文件连接管理器在配置列分隔符时遇到错误Ç
此示例显示了使用列分隔符配置的单独的平面文件连接管理器Ç
,该分隔符执行但遇到警告并且不处理任何行.
右键单击Connection Managers
并单击New Flat File Connection...
以创建连接以读取平面文件.在" 平面文件连接管理器编辑器"的General
页面上,执行以下操作:
ProductListPrice_Cedilla
Flat file connection manager with Cedilla column delimiter.
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
选择平面文件路径.{LF}
从标题行分隔符中选择Column names in the first data row
Columns
页面在" 平面文件连接管理器编辑器"的Columns
页面上,执行以下操作:
{LF}
Reset Columns
Ç
Advanced
页面在" 平面文件连接管理器编辑器"的Advanced
页面上,执行以下操作:
ProductId
Ç
Unicode string [DT_WSTR]
30
ListPrice
在" 平面文件连接管理器编辑器"的Advanced
页面上,执行以下操作:
ListPrice
{LF}
numeric [DT_NUMERIC]
12
2
OK
将a拖放Data Flow task
到" 控制流"选项卡上并将其命名为File to database - With Cedilla delimiter
.禁用第一个数据流任务.
使用Flat File Source
和配置第二个数据流任务OLE DB Destination
双击平面文件源以打开Flat File Source Editor
.在Flat File Source Editor的Connection Manager
页面上,选择Flat File Connection Manager,然后单击Columns页面以配置列.点击. ProductListPrice_Cedilla
OK
执行包.所有组件都将显示绿色,表示该过程成功但不会处理任何行.您可以看到Flat File Source
和之间没有行号指示OLE DB Destination
单击Progress
选项卡,您将看到以下警告消息.
[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.
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
36389 次 |
最近记录: |