Почему SSIS не распознает разделитель строк строки {LF} при импорте плоского файла UTF-8?

Я пытаюсь импортировать данные из плоского файла в кодировке utf-8 в SQL Server 2008 с помощью служб SSIS. Вот как выглядит конец данных строки в Notepad++:

enter image description here

У меня есть еще несколько изображений, показывающих, как выглядит диспетчер соединений с файлами:

enter image description here

enter image description here

вы можете видеть, что данные отображаются правильно в предварительном просмотре диспетчера соединений файлов. Когда я пытаюсь импортировать эти данные, строки не импортируются. Я получаю сообщение об ошибке, указывающее, что разделитель строк не найден. В образах диспетчера соединений файлов можно увидеть, что разделитель строк заголовка и разделитель строк имеют значение {LF}. Этого было достаточно для создания правильного предварительного просмотра, поэтому я теряюсь, почему он не работал для импорта. Я пробовал ряд вещей, которые принесли нулевые результаты:

  • пробовал использовать импорт мастера в SSMS...те же результаты
  • пробовал использовать преобразование данных, нет удар
  • попробовал установить разделитель строк в (0a), те же результаты

[Источник Плоского Файла [582]] Предупреждение: конец файла данных был достигнут в то время как чтение строк заголовка. Убедитесь, что разделитель строк заголовка и число строки заголовка для пропуска правильны.

Спасибо за глядя на это и я очень ценю любую помощь вы можете предложить.

3 ответов


причина:

SSIS не удается прочитать файл и отображает предупреждение ниже из-за разделителя столбца Ç ( " c " с cedilla) и not из-за линии разделителя {LF} (Строки).

[Read flat file [1]] Warning: The end of the data file was reached while 
reading header rows. Make sure the header row delimiter and the number of 
header rows to skip are correct.

вот пример пакета служб SSIS, который показывает, как решить проблему с помощью Script Component и в конце есть еще один пример, который имитирует вопрос.

ниже Источник "Плоский Файл" выберите Transformation и нажмите кнопку OK. Подключите зеленую стрелку от Источник "Плоский Файл" to Компонент Скрипта. Дважды щелкните Компонент Скрипта открыть Script Transformation Editor.

клик Входные Столбцы on Редактор Преобразования "Скрипт" и выберите LineData колонна. Нажмите входы и выходы страница.

Script Transformation Editor - Input Columns

на Inputs and Outputs страница Редактор Преобразования "Скрипт" выполните следующие действия.

  • измените имя входных данных на FlatFileInput
  • измените имя выходных данных на SplitDataOutput
  • выберите Столбцы Вывода и нажмите кнопку Add Column. Повторите это еще раз, чтобы добавить еще один столбец.
  • назовите первый столбец ProductId
  • установить тип колонки ProductId to Unicode string [DT_WSTR]
  • установить длина to 30

Script Transformation Editor - Inputs and Outputs - ProductId

на Inputs and Outputs страница Редактор Преобразования "Скрипт", выполните следующие действия.

  • назовите второй столбец ListPrice
  • установить тип колонки ListPrice to numeric [DT_NUMERIC]
  • установить точность to 12
  • установить масштаб to 2
  • клик скрипт страница для изменения сценарий

Script Transformation Editor - Inputs and Outputs - ListPrice

на Script страница Редактор Преобразования "Скрипт" выполните следующие действия.

  • Нажмите кнопку с многоточием против ReadOnlyVariables и выберите переменную User::ColumnDelimiter
  • клик Edit Script...

Script Transformation Editor - Script

вставить ниже C# в Редакторе сценариев. Скрипт выполняет следующие задачи.

  • использование значения разделителя столбцов Ç определено в переменной Пользователь::ColumnDelimiter метод FlatFileInput_ProcessInputRow разбивает входящее значение и присваивает его двум выходным столбцам, определенным в преобразовании компонента скрипта.

код компонента скрипта в В C#

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    public override void PreExecute()
    {
        base.PreExecute();
    }

    public override void PostExecute()
    {
        base.PostExecute();
    }

    public override void FlatFileInput_ProcessInputRow(FlatFileInputBuffer Row)
    {
        const int COL_PRODUCT = 0;
        const int COL_PRICE = 1;

        char delimiter = Convert.ToChar(this.Variables.ColumnDelimiter);
        string[] lineData = Row.LineData.ToString().Split(delimiter);

        Row.ProductId = String.IsNullOrEmpty(lineData[COL_PRODUCT]) 
                            ? String.Empty 
                            : lineData[COL_PRODUCT];

        Row.ListPrice = String.IsNullOrEmpty(lineData[COL_PRICE]) 
                            ? 0 
                            : Convert.ToDecimal(lineData[COL_PRICE]);
    }
}

Script Component Code - C#

перетащить OLE DB Destination на Поток Данных tab. Подключите зеленую стрелку от Компонент Скрипта to назначение OLE DB. Дважды щелкните назначение OLE DB открыть OLE DB Destination Editor.

на Connection Manager страница редактор назначения OLE DB выполните следующие действия.

  • выберите Sora с диспетчер соединений OLE DB
  • выберите Table or view - fast load с режим доступа к данным
  • выберите [dbo].[ProductListPrice] с название таблицы или представления
  • клик отображений страница

OLE DB Destination Editor - Connection Manager

клик Mappings страница на редактор назначения OLE DB автоматически сопоставит столбцы, если имена входных и выходных столбцов совпадают. Нажмите OK.

OLE DB Destination Editor - Mappings

Поток Данных вкладка должна выглядеть примерно так После настройки всех компонентов.

Data Flow tab

выполнить запрос select * from dbo.ProductListPrice на среда SQL Server Management Studio (SSMS) найти количество строк в таблица. Перед выполнением пакета он должен быть пустым.

Rows in table before package execution

выполнить пакет. Вы заметите, что пакет успешно обработан 9 строк. Плоский файл содержит 10 строки, но первая строка-это заголовок с именами столбцов.

Package execution without delimiter

выполнить запрос select * from dbo.ProductListPrice на среда SQL Server Management Studio (SSMS) найти 9 строки успешно вставлены в таблицу. Данные должны совпадать с данными плоского файла.

Rows in table after package execution

приведенный выше пример иллюстрирует, как вручную разделить данные с помощью Компонент Скрипта потому что Диспетчер Соединений С Плоскими Файлами обнаруживает ошибку при настройке разделителя столбцов Ç

Проблемы Моделирования:

в этом примере показан отдельный Плоский Файл Диспетчер Соединений настроен с разделителем столбцов Ç, который выполняет, но встречает предупреждение и не обрабатывает строки.

щелкните правой кнопкой мыши на Connection Managers и нажмите кнопку New Flat File Connection... чтобы создать соединение для чтения плоского файла. На General страница Редактор Диспетчера Соединений С Плоскими Файлами выполните следующие действия:

  • установить диспетчер подключений имя to ProductListPrice_Cedilla
  • описание набора для Flat file connection manager with Cedilla column delimiter.
  • у меня есть файл в папку C:\Siva\StackOverflow\Files68205\ProductListPrice.txt выберите путь к плоскому файлу.
  • выберите {LF} с Разделитель Строк Заголовка
  • Регистрация Column names in the first data row
  • клик Columns страница

Flat File Connection Manager Editor - With Cedilla - General

на Columns страница Редактор Диспетчера Соединений С Плоскими Файлами выполните следующие действия:

  • Set разделитель строк to {LF}
  • поле разделителя столбцов может быть отключено. Нажмите Reset Columns
  • Set разделитель столбцов в Ç
  • клик Advanced страница

Flat File Connection Manager Editor - With Cedilla - Columns

на Advanced страница Редактор Диспетчера Соединений С Плоскими Файлами выполните следующие действия:

  • установить имя to ProductId
  • установить ColumnDelimiter в Ç
  • установить тип to Unicode string [DT_WSTR]
  • установить длина to 30
  • щелкните столбец ListPrice

Flat File Connection Manager Editor - With Cedilla - Advanced - ProductId

на Advanced страница Редактор Диспетчера Соединений С Плоскими Файлами выполните следующие действия:

  • установить имя to ListPrice
  • установить ColumnDelimiter to {LF}
  • установить тип to numeric [DT_NUMERIC]
  • установить DataPrecision to 12
  • установить DataScale to 2
  • клик OK

Flat File Connection Manager Editor - With Cedilla - Advanced - ListPrice

перетащить Data Flow task на Поток Управления tab и назовите его как File to database - With Cedilla delimiter. Отключаем первую задачу потока данных.

Data Flow Task 2

настройте вторую задачу потока данных с помощью Flat File Source и OLE DB Destination

Data Flow Tab - 2

дважды щелкните источник плоского файла, чтобы открыть Flat File Source Editor. На Connection Manager страница Редактор Источника "Неструктурированный Файл" выберите Диспетчер Соединений С Плоскими Файлами ProductListPrice_Cedilla и нажмите кнопку колонки страница для настройки колонок. Нажмите OK.

Flat File Source Editor - Cedilla

выполнить пакет. Все компоненты будут отображаться зеленым цветом, чтобы указать, что процесс прошел успешно, но строки не будут обработаны. Вы можете видеть, что между Flat File Source и OLE DB Destination

Package Execution - Cedilla

выберите Progress tab, и вы заметите следующее предупреждающее сообщение.

[Read flat file [1]] Warning: The end of the data file was reached while 
reading header rows. Make sure the header row delimiter and the number of 
header rows to skip are correct.

Progress Warning message


ответ выше, кажется ужасно сложным, просто конвертировать окончания строк в файле

Dim FileContents As String = My.Computer.FileSystem.ReadAllText("c:\Temp\UnixFile.csv")

Dim NewFileContents As String = FileContents.Replace(vbLf, vbCrLf)

My.Computer.FileSystem.WriteAllText("c:\temp\WindowsFile.csv", NewFileContents, False, New System.Text.UnicodeEncoding)

перефразированный от здесь


эта проблема также возникает, если вы пытаетесь использовать FlatFile, созданный на другой платформе, такой как Unix, Mac и т. д. Через SSIS в windows

в таком сценарии все, что вам нужно сделать, это преобразовать формат файла из say UNIX в DOS с помощью команды unix2dos

unix2dos file-to-convert