如何处理FLAT FILE中的奇怪记录?

时间:2012-05-04 15:52:37

标签: sql-server ssis batch-file

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. 删除任何嵌入的“在实际字段中为”是文本限定符吗?
  3. 任何人都知道如何在windows,dos或vba中为如此大量的文件执行此操作以使其自动化?

4 个答案:

答案 0 :(得分:3)

对于这样的数据,我更喜欢使用脚本组件来执行解析。我写了blog post describing one approach

希望这有帮助, 安迪

答案 1 :(得分:1)

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

出现在田野中间的“限定词是一个真正的混乱,你可能能够制定规则来清理它,但不能保证你会成功。

答案 2 :(得分:1)

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

是的,当整个字段被文本限定符包围时,您肯定需要从实际字段中删除任何文本限定符(或根据您的意愿转义它们)。这会引起混淆。

就个人而言,我会通过编写一个python脚本来预处理数据,然后再将其提供给SSIS,或者让脚本将整个内容导入到SQL中来解决这个问题。

答案 3 :(得分: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's post

提供了一步一步的教程