0

在这种情况下,SSIS 倒在了后面。

在我的平面文件中,我们有这样的正常记录

"1","2","STATUSCHANGED","A","02-MAY-12 21:52:34","","Re","Initial review",""

有些像这样;(记录分布在几行)

"1","2","SALESNOTIFICATIONRESPOND","Ac","02-MAY-12 21:55:19","From: W, J 
Sent: Wednesday, May 08, 2012 2:00 PM
To: XXXX, A; Acost
Subject: RE: Notification Id 1219 - Qu ID XXXXXX 
I got this from earlier today. Our team is reviewing the request. 



Thanks, 

Hi,

This account belongs to D please approve/deny.

Thanks!

Claud","","","Reassign"

因此,查看 NOTEPAD + 中的文件真是太棒了,它告诉我,在分布在多行的那个字段中,我应该取出该字段中的所有 {CR}{LF}。

此文件的行分隔符是 LF,文本限定符是“.

所以我需要对 200 个文件的集合做两件事?

  1. 删除文件中的所有 {CR}{LF} ?
  2. 删除任何嵌入在实际字段中的“作为文本限定符?

任何人都知道如何在 Windows、dos 或 vba 中为如此大量的文件执行此操作,使其自动化?

4

4 回答 4

3

对于这样的数据,我更喜欢使用脚本组件来执行解析。我写了一篇描述一种方法的博客文章

希望这会有所帮助,安迪

于 2012-05-04T19:47:59.020 回答
1

Powershell 将为 {CR}{LF} 为您执行此操作,但如果您以前从未使用过 powershell,则可能需要一段时间来编写代码。

" 出现在字段中间的限定符真是一团糟,您也许可以制定规则来清理它,但不能保证您一定会成功。

于 2012-05-04T16:11:04.300 回答
1

如果正确的行终止符只是 LF,并且您确定每一行都被 LF 正确终止,那么您可以删除所有 {CR}{LF},但实际上不需要。只要它们 {CR}{LF} 正确地位于一对文本限定符中,它就应该按字面意思导入。

是的,当整个字段被文本限定符包围时,您肯定需要从实际字段中删除任何文本限定符(或根据您的喜好对其进行转义)。那会造成混乱。

就个人而言,我会通过编写一个python脚本在将数据提供给 SSIS 之前对数据进行预处理,或者只是让脚本为我将整个内容导入 SQL 来解决这个问题。

于 2012-05-04T16:21:14.737 回答
0

我同意安迪的观点。我有一个类似的问题,我用一个脚本组件任务来处理它。您的代码可能看起来像这样(不处理 CR LF 问题)

Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper

<Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute> _
<CLSCompliant(False)> _
Public Class ScriptMain
    Inherits UserComponent

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
        Dim strRow As String
        Dim strColSeperator As String
        Dim rowValues As String()
        strRow = Row.Line.ToString()
        If strRow.Contains(",") Then
            strColSeperator = (",")
        ElseIf strRow.Contains(";") Then
            strColSeperator = ";"
        End If

        rowValues = Row.Line.Split(CChar(strColSeperator))
        If (rowValues.Length > 1) Then
            Row.Code = rowValues.GetValue(0).ToString()
            Row.Description = rowValues.GetValue(1).ToString()
            Row.Blank = rowValues.GetValue(2).ToString()
            Row.Weight = rowValues.GetValue(3).ToString()
            Row.Scan = rowValues.GetValue(4).ToString()
        End If
    End Sub

End Class

Andy Mitchell 的帖子中提供了分步教程

于 2012-05-04T21:19:20.480 回答