sql-server — SSIS читает LF как терминатор, когда он установлен как CRLF" />

SSIS читает LF как терминатор, когда он установлен как CRLF

с использованием служб SSIS 2012. Мой диспетчер соединений с плоскими файлами У меня есть файл с разделителями, в котором в качестве разделителя строк задано CRLF, но когда оно обрабатывает файл, у меня есть текстовый столбец, который содержит LF. Это заставляет его читать это как терминатор строки, вызывая его сбой. Есть идеи?

7 голосов | спросил vin 24 Maypm17 2017, 19:58:06

4 ответа


0

спасибо за все предложения. Оказалось, что производитель изменил кодировку файла с Ascii на Unicode. изменение пакета для чтения правильной кодировки сделало свое дело.

ответил vin 6 J0000006Europe/Moscow 2017, 01:29:11
0

Прежде чем ответить, я не думаю, что столбец содержит только LF, потому что, если разделитель строк равен CRLF он не будет считать его разделителем. Так что это, вероятно, CRLF, но я дам решение для двух случаев (CRLF или LF)

Решение

Вы можете исправить эту ситуацию, выполнив следующие действия:

  1. Сначала в диспетчере соединений с плоскими файлами добавьте только один столбец (типа DT_STR и длины 4000), поэтому вы будете рассматривать каждую строку как один столбец.
  2. В задаче потока данных необходимо добавить компонент Script, который исправляет структуру файла. и разбить строку на столбцы.

Простой тест

Я рассмотрю плоский файл со следующим содержанием

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, 2 x Script Component, OLEDB Destination

  2. В первом компоненте сценария я отмечу Column0 как входные данные и добавлю 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
    
    Public Sub AssignMemoryVariablesToOutput()
    
        With Output0Buffer
    
            .AddRow()
            .NewRow = strLine
        End With
    
    End Sub
    
    Public Function AreVariablesEmpty() As Boolean
    
        If strLine = "" Then
    
            Return True
    
        Else
    
            Return False
    
        End If
    
    
    End Function
    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
    
        Dim strColumns As String() = Row.Column0.Split(CChar(strDelimiter))
    
        If strColumns.Length = 5 Then
    
            If Not AreVariablesEmpty() Then
                AssignMemoryVariablesToOutput()
                EmptyMemoryVariables()
            End If
    
            strLine = Row.Column0
    
            AssignMemoryVariablesToOutput()
            EmptyMemoryVariables()
    
    
        Else
    
            If strLine.Split(CChar(strDelimiter)).Length = 5 Then
    
                AssignMemoryVariablesToOutput()
                EmptyMemoryVariables()
    
            End If
    
    
            strLine &= Row.Column0
    
    
    
    
    
    
    
        End If
    
  2. Во втором компоненте сценария я разделю каждую строку на столбцы

 введите описание изображения здесь

    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

Важное примечание: предоставленный код не является оптимальным, может потребоваться больше проверок или может быть проще и лучше, но я пытаюсь дать вам способ решения этой проблемы

ответил Hadi 27 Maypm17 2017, 17:47:47
0

У меня нет опыта в SSIS, но как разработчик ETL я сталкивался с этим много раз. Так что мои предложения могут не помочь вам решить проблему, но, надеюсь, направят вас в правильном направлении

  • Если в проблемном поле есть текстовый квалификатор (одинарная или двойная кавычка) обычно) и SSIS поддерживает его использование
  • Также, если есть опция чтобы заставить SSIS использовать другой разделитель конца записи, отличный от LF (в данном случае CRLF), я бы использовал его (надеюсь, в тексте проблемного поля нет CRLF)
  • Если проблемное поле не является последним полем, вы можете подсчитать количество ограничителей, прочитав всю запись как одно поле с разделителями LF, чтобы выявить и отфильтровать записи о проблемах (если их всего несколько) и попробуй их прошить обратно
  • Если возможно, прочитайте файл как одиночный запись (если в SSIS есть опция) и замена всех LF при условии, что CR согласованный конец разделителя записей из источника
ответил AlwaysConfused 1 J0000006Europe/Moscow 2017, 19:44:08
0

В вашем компоненте диспетчера соединений с плоскими файлами у вас есть свойство, которое я забыл назвать, в нем вы можете установить разделитель строк ({CR}{LF}, {LF}, {CR}, .. .etc).

Пожалуйста, попробуйте настроить это свойство, я думаю, оно будет работать.

ответил Jardel Novaes 31 Maypm17 2017, 18:36:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132