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以查看变量窗格.在包范围中创建一个名为ColumnDelimiterdata type 的新变量,并使用该值设置变量StringSO_6268205Ç

右键单击Connection Managers并单击New Flat File Connection...以创建连接以读取平面文件.

在" 平面文件连接管理器编辑器"的General页面上,执行以下操作:
ProductListPriceFlat file connection manager to read product list price information.C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt {LF}从标题行分隔符中选择Column names in the first data rowColumns页面
在" 平面文件连接管理器编辑器"的Columns页面上,验证该文件是否Column delimiter为空并已禁用.点击Advanced页面.

在" 平面文件连接管理器编辑器"的Advanced页面上,执行以下操作.
LineData{LF}Unicode string [DT_WSTR]255Preview页面.
在" 平面文件连接管理器编辑器 " 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页面上,选中该列并单击.LineDataOK

将a拖放Script Component到Flat File Source下面的Data Flow选项卡上,选择并单击.将绿色箭头从平面文件源连接到脚本组件.双击脚本组件以打开.TransformationOKScript Transformation Editor
单击" 脚本转换编辑器"上的" 输入列"并选择LineData列.单击" 输入和输出"页面.

在" 脚本转换编辑器"的Inputs and Outputs页面上,执行以下操作.
SplitDataOutputAdd Column.再次重复此操作以添加另一列.ProductId Unicode string [DT_WSTR]30
在" 脚本转换编辑器"的Inputs and Outputs页面上,执行以下操作.
ListPrice numeric [DT_NUMERIC]122
在" 脚本转换编辑器"的Script页面上,执行以下操作.
User::ColumnDelimiterEdit 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_CedillaFlat file connection manager with Cedilla column delimiter.C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt选择平面文件路径.{LF}从标题行分隔符中选择Column names in the first data rowColumns页面
在" 平面文件连接管理器编辑器"的Columns页面上,执行以下操作:
{LF}Reset ColumnsÇAdvanced页面
在" 平面文件连接管理器编辑器"的Advanced页面上,执行以下操作:
ProductIdÇUnicode string [DT_WSTR]30ListPrice
在" 平面文件连接管理器编辑器"的Advanced页面上,执行以下操作:
ListPrice{LF}numeric [DT_NUMERIC]122OK
将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_CedillaOK

执行包.所有组件都将显示绿色,表示该过程成功但不会处理任何行.您可以看到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)
