1

コア システムから抽出した CSV ファイルがあります。システムに対する最近の開発変更により、CSV ファイル データに重複する列/フィールド名が含まれるようになりました。

したがって、フィールドは複数回表示されます。

  • 作成者の名
  • 作成者の姓
  • クリエイター給与番号
  • 収益
  • コンタクト
  • セールスチーム
  • チャネル

次に、このデータを SSIS/DTS パッケージ経由でアップロードします。パッケージは実際には実行されず、重複したフィールド名では機能しません。そのため、重複するフィールドを削除するか、名前を変更する必要があります。

そのため、重複するフィールド名の名前を変更する C# または VB スクリプトを作成して、1 を超えるフィールド名をカウントするときにポスト フィックスを 1 にしようと考えていました。

Microsoft.VisualBasic.FileIO.TextFieldParser または類似のものを使用してこれを行う簡単な方法はありますか? 誰かが同様の問題に遭遇したかどうかはわかりません。

Visual Basic 2008 コード (下記) WIP を実行するスクリプト タスクを追加しました。

Public Sub Main()

    'Check if file exist
    Dim filename As String = Dts.Variables.Item("fileName").Value
    If Not System.IO.File.Exists(filename) Then
        Exit Sub
    End If

    Dim csvFileArray(1, 1) As String
    Dim newCsvFileArray(1, 1) As String
    Dim streamReader As StreamReader = File.OpenText(filename)
    Dim strlines() As String

    strlines = streamReader.ReadToEnd().Split(Environment.NewLine)

    ' Redimension the array.
    Dim num_rows As Long
    Dim num_cols As Long
    'Dim counter As Integer = 0     '' >> Idea is to add this to the array as a 3rd dimension so we can count each field
    Dim fieldCounter As Integer = 0
    Dim strline() As String

    num_rows = UBound(strlines)
    strline = strlines(0).Split(",")
    num_cols = UBound(strline)
    ReDim csvFileArray(num_rows, num_cols)
    ReDim newCsvFileArray(num_rows, num_cols)

    ' Copy the data into the array.
    Dim fields As Integer
    Dim rows As Integer

    For rows = 0 To num_rows - 1
        strline = strlines(rows).Split(",")
        For fields = 0 To num_cols - 1
            csvFileArray(rows, fields) = strline(fields)
        Next
    Next

    Dim currentField As String = ""
    Dim comparrisionField As String = ""

    Dim newRows As Integer = 0
    Dim newFields As Integer = 0
    rows = 0

    ' Compare the current array to if they match anything in the new array
    For rows = 0 To num_rows - 1
        For fields = 0 To num_cols - 1
            currentField = csvFileArray(rows, fields)


            If rows = 0 Then
                ' If we are dealing with Fields i.e Row=0
                For newFields = 0 To num_cols - 1

                    comparrisionField = newCsvFileArray(newRows, newFields)
                    If String.IsNullOrEmpty(currentField) Then
                    Else
                        If currentField.Equals(comparrisionField) Then

                            If currentField <> "" Then
                                fieldCounter = fieldCounter + 1

                                ' if we have already added this column, then append a number
                                If fieldCounter >= 1 Then
                                    currentField = currentField + " " + CStr(fieldCounter)
                                End If
                            End If
                        End If
                    End If


                Next
            Else
                ' This means we are dealing with the Rows i/e not row = 0
                currentField = currentField
            End If
            newRows = 0
            newFields = 0
            fieldCounter = 0
            ' save currentField in the same layout as the initial file
            newCsvFileArray(rows, fields) = currentField
        Next
    Next

    ' Amend the duplicate field names
    Dim sw As New System.IO.StreamWriter(Left(filename, Len(filename) - Len(Right(filename, 4))) + "_amended.csv")
    rows = 0
    Dim currentLine As String = ""

    For rows = 0 To num_rows - 1
        For fields = 0 To num_cols - 1
            ' Save the data back to the filesystem
            If fields = 0 Then
                currentLine = newCsvFileArray(rows, fields)
            Else
                currentLine = currentLine + "," + newCsvFileArray(rows, fields)
            End If
        Next
        If currentLine <> "" Then
            sw.WriteLine(currentLine.Replace(vbCr, "").Replace(vbLf, ""))
        End If
    Next

    sw.Close()

    Dts.TaskResult = ScriptResults.Success
End Sub
4

0 に答える 0