首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当LF设置为CRLF时,SSIS将LF作为终止符读取

当LF设置为CRLF时,SSIS将LF作为终止符读取
EN

Stack Overflow用户
提问于 2017-05-24 16:58:06
回答 5查看 3.2K关注 0票数 7

使用SSIS 2012。我的平面文件连接管理器有一个分隔文件,其中行分隔符设置为CRLF,但是当它处理该文件时,我有一个文本列,其中包含一个LF。这导致它将其读取为行结束符,导致其失败。有什么想法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-06-05 22:29:11

谢谢你的建议。结果发现,供应商已将文件的编码从Ascii更改为unicode。将包更改为读取正确的编码就可以了。

票数 2
EN

Stack Overflow用户

发布于 2017-05-27 14:47:47

在回答之前,我不认为该列只包含LF,因为如果行分隔符是CRLF,则不会将其视为分隔符。所以这可能是CRLF__,但我会给出这两种情况的解决方案(CRLF或LF)。

解决方案

可以通过以下步骤解决此情况:

  1. 首先,在平面文件连接管理器中,只添加一列(类型为DT_STR和length 4000),因此您将每一行视为一列。
  2. 在数据流任务中,您必须添加一个修复文件结构的脚本组件。并将行分割成列。

简单测试

我将考虑一个具有以下内容的平面文件

代码语言:javascript
运行
复制
ID;name;DOB;Notes;ClassID{CRLF}
1;John;2001-01-01;;1{CRLF}
2;Moh;2002-01-01;Very cool{LF}
Genius;2{CRLF}
3;Ali;2000-01-01;Calm;2{CRLF}
  1. 首先,我将添加一个带有以下选项的平面文件连接管理器:
    • 行分隔符= {CRLF}
    • 标头行分隔符= {CRLF}

  1. 在DataFlow任务中,我将添加一个Flat File Source,2x Script ComponentOLEDB Destination
  2. 在第一个脚本组件中,我将Column0标记为input,我将添加5个输出列ID,Name,DOB,Notes,ClassID,并将输出同步输入设置为None

  1. 在第一个脚本组件中,我将编写一个脚本,将每行存储在内存变量中,并在行完成时将其分配给输出行,并在出现另一行时将其分配给输出行。 Dim strLine As String = String.Empty Dim strDelimiter As String = ";“Public Sub EmptyMemoryVariables() strLine = String.Empty End Sub Sub AssignMemoryVariablesToOutput() Output0Buffer .AddRow() .NewRow = strLine End With End Sub Public Function AreVariablesEmpty()作为布尔值If strLine =”,然后返回True Else,如果End Function重写Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer) Dim strColumns作为String() = Row.Column0.Split(CChar(strDelimiter )))如果strColumns.Length =5,那么如果不是AreVariablesEmpty(),则AssignMemoryVariablesToOutput() EmptyMemoryVariables()结束如果strLine = Row.Column0 AssignMemoryVariablesToOutput() EmptyMemoryVariables(),如果strLine.Split(CChar(strDelimiter )) .Length =5,则AssignMemoryVariablesToOutput() EmptyMemoryVariables()结束strLine &= Row.Column0 End
  2. 在第二个脚本COmponent中,我将将每一行拆分为列

代码语言:javascript
运行
复制
    Dim strDelimiter As String = ";"
    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

        Dim strColumns As String() = Row.NewRow.Split(CChar(strDelimiter))


        Row.ID = strColumns(0)
        Row.NAME = strColumns(1)
        Row.DOB = strColumns(2)
        Row.NOTES = strColumns(3)
        Row.CLASSID = strColumns(4)


    End Sub

重要注意:提供的代码不是最优的,它可能需要更多的验证,或者可以更简单和更好,但我试图给您提供解决这个问题的方法

票数 2
EN

Stack Overflow用户

发布于 2017-06-01 16:44:08

我没有SSIS经验,但作为一名ETL开发人员,我曾多次遇到这种情况。因此,我的建议可能无助于你解决问题,但希望能为你指明正确的方向。

  • 如果问题字段有文本限定符(通常为单引号或双引号),并且SSIS支持使用它
  • 另外,如果有一个选项可以强制SSIS使用与LF不同的记录分隔符(在本例中为CRLF ),我将使用它(希望在问题字段文本中没有CRLF)。
  • 如果问题字段不是最后一个字段,则可以将整个记录读取为一个LF分隔字段,以识别和筛选出问题记录(如果只有少数),并尝试将其插入回。
  • 如果可能的话,将文件读入单个记录(如果SSIS有一个选项)并替换所有LF,前提是CR是来自源的记录分隔符的一致结尾。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44164504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档