Sql server 为什么';SSI在导入UTF-8平面文件时是否识别换行符{LF}行分隔符?
我正在尝试使用SSIS将数据从utf-8编码的平面文件导入SQL Server 2008。这是记事本++中的行尾数据的外观: 我还有几张图片显示了文件连接管理器的外观: 您可以看到数据在文件连接管理器预览中正确显示。当我尝试导入此数据时,没有行导入。我收到一条错误消息,指示找不到行分隔符。您可以在文件连接管理器图像中看到,标题行分隔符和行分隔符都设置为Sql server 为什么';SSI在导入UTF-8平面文件时是否识别换行符{LF}行分隔符?,sql-server,sql-server-2008,utf-8,ssis,flat-file,Sql Server,Sql Server 2008,Utf 8,Ssis,Flat File,我正在尝试使用SSIS将数据从utf-8编码的平面文件导入SQL Server 2008。这是记事本++中的行尾数据的外观: 我还有几张图片显示了文件连接管理器的外观: 您可以看到数据在文件连接管理器预览中正确显示。当我尝试导入此数据时,没有行导入。我收到一条错误消息,指示找不到行分隔符。您可以在文件连接管理器图像中看到,标题行分隔符和行分隔符都设置为{LF}。这足以生成正确的预览,因此我不明白为什么导入时它不起作用。我尝试了一些没有结果的事情: 尝试在SSMS中使用向导导入…结果相同
{LF}
。这足以生成正确的预览,因此我不明白为什么导入时它不起作用。我尝试了一些没有结果的事情:
- 尝试在SSMS中使用向导导入…结果相同
- 尝试使用数据转换,没有影响
- 尝试将行分隔符设置为(0a),结果相同
ch
(“带cedilla的c”)和行分隔符{LF}
(换行符)造成的
下面是一个示例SSIS包,它显示了如何使用脚本组件解决问题,最后还有另一个模拟问题的示例
决议:
下面的示例包是在SSIS 2008 R2
中编写的。它以行分隔符{LF}
作为单个列值读取平面文件;然后使用脚本组件
拆分数据,将信息插入SQL Server 2008 R2
数据库中的表中
用于创建包含少量行的简单平面文件。下面的示例文件在每一行上都有产品Id和标价信息,以ch
作为列分隔符分隔,每一行以{LF}
分隔符结尾
在记事本++上,单击编码
,然后单击UTF-8编码
,以UTF-8编码保存平面文件
此示例将使用名为Sora的SQL Server 2008 R2数据库。使用下面给定的脚本创建一个名为dbo.ProductListPrice
的新表。SSIS将把平面文件数据插入该表
USE Sora;
GO
CREATE TABLE dbo.ProductListPrice
(
ProductId nvarchar(30) NOT NULL
, ListPrice numeric(12,2) NOT NULL
);
GO
使用Business Intelligence Development Studio(BIDS)2008 R2创建SSIS包。将包命名为SO_6268205.dtsx
。创建名为Sora.ds
的数据源,以连接到SQL Server 2008 R2中的数据库Sora
右键单击程序包内的任意位置,然后单击变量
,以查看变量窗格。在包范围SO_6268205
中创建一个名为columndimiter
的数据类型String
的新变量,并使用值设置变量
右键单击连接管理器
,然后单击新建平面文件连接…
创建一个连接以读取平面文件
在平面文件连接管理器编辑器的常规
页面上,执行以下操作:
- 将连接管理器名称设置为
ProductListPrice
- 将“说明”设置为“平面文件连接管理器”,以读取产品列表价格信息。
选择平面文件路径。我的文件位于路径C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
从标题行分隔符中选择{LF}
检查第一个数据行中的列名
单击列
页面
在平面文件连接管理器编辑器的列
页面上,验证列分隔符
是否为空且已禁用。单击Advanced
页面
在平面文件连接管理器编辑器的Advanced
页面上,执行以下操作
- 将名称设置为
LineData
- 验证列分隔符是否设置为
{LF}
- 将数据类型设置为
Unicode字符串[DT\u WSTR]
- 将OutputColumnWidth设置为
255
- 单击
预览
页面
在平面文件连接管理器编辑器的“预览”页面上,验证显示的数据是否正确,然后单击“确定”
您将在包底部的连接管理器
选项卡上看到数据源Sora和平面文件连接管理器ProductListPrice
将数据流任务
拖放到包的控制流选项卡上,并将其命名为文件到数据库-不带Cedilla分隔符
双击数据流任务,将视图切换到包上的数据流
选项卡。将平面文件源
拖放到“数据流”选项卡上。双击平面文件源以打开平面文件源编辑器
在平面文件源代码编辑器的连接管理器
页面上,选择平面文件连接管理器产品列表价格
,然后单击列页面
在平面文件源代码编辑器的Columns
页面上,检查列LineData
,然后单击OK
将脚本组件
拖放到下面的数据流选项卡上
USE Sora;
GO
CREATE TABLE dbo.ProductListPrice
(
ProductId nvarchar(30) NOT NULL
, ListPrice numeric(12,2) NOT NULL
);
GO
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]);
}
}
[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.
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)
unix2dos file-to-convert