Почему SSIS не распознает разделитель строк строки {LF} при импорте плоского файла UTF-8?
Я пытаюсь импортировать данные из плоского файла в кодировке utf-8 в SQL Server 2008 с помощью служб SSIS. Вот как выглядит конец данных строки в Notepad++:
У меня есть еще несколько изображений, показывающих, как выглядит диспетчер соединений с файлами:
вы можете видеть, что данные отображаются правильно в предварительном просмотре диспетчера соединений файлов. Когда я пытаюсь импортировать эти данные, строки не импортируются. Я получаю сообщение об ошибке, указывающее, что разделитель строк не найден. В образах диспетчера соединений файлов можно увидеть, что разделитель строк заголовка и разделитель строк имеют значение {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
колонна. Нажмите входы и выходы страница.
на Inputs and Outputs
страница Редактор Преобразования "Скрипт" выполните следующие действия.
- измените имя входных данных на FlatFileInput
- измените имя выходных данных на
SplitDataOutput
- выберите Столбцы Вывода и нажмите кнопку
Add Column
. Повторите это еще раз, чтобы добавить еще один столбец. - назовите первый столбец
ProductId
- установить тип колонки ProductId to
Unicode string [DT_WSTR]
- установить длина to
30
на Inputs and Outputs
страница Редактор Преобразования "Скрипт", выполните следующие действия.
- назовите второй столбец
ListPrice
- установить тип колонки ListPrice to
numeric [DT_NUMERIC]
- установить точность to
12
- установить масштаб to
2
- клик скрипт страница для изменения сценарий
на Script
страница Редактор Преобразования "Скрипт" выполните следующие действия.
- Нажмите кнопку с многоточием против ReadOnlyVariables и выберите переменную
User::ColumnDelimiter
- клик
Edit 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]);
}
}
перетащить 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]
с название таблицы или представления - клик отображений страница
клик Mappings
страница на редактор назначения OLE DB автоматически сопоставит столбцы, если имена входных и выходных столбцов совпадают. Нажмите OK
.
Поток Данных вкладка должна выглядеть примерно так После настройки всех компонентов.
выполнить запрос select * from dbo.ProductListPrice
на среда SQL Server Management Studio (SSMS) найти количество строк в таблица. Перед выполнением пакета он должен быть пустым.
выполнить пакет. Вы заметите, что пакет успешно обработан 9 строк. Плоский файл содержит 10 строки, но первая строка-это заголовок с именами столбцов.
выполнить запрос select * from dbo.ProductListPrice
на среда SQL Server Management Studio (SSMS) найти 9 строки успешно вставлены в таблицу. Данные должны совпадать с данными плоского файла.
приведенный выше пример иллюстрирует, как вручную разделить данные с помощью Компонент Скрипта потому что Диспетчер Соединений С Плоскими Файлами обнаруживает ошибку при настройке разделителя столбцов Ç
Проблемы Моделирования:
в этом примере показан отдельный Плоский Файл Диспетчер Соединений настроен с разделителем столбцов Ç
, который выполняет, но встречает предупреждение и не обрабатывает строки.
щелкните правой кнопкой мыши на 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
страница
на Columns
страница Редактор Диспетчера Соединений С Плоскими Файлами выполните следующие действия:
- Set разделитель строк to
{LF}
- поле разделителя столбцов может быть отключено. Нажмите
Reset Columns
- Set разделитель столбцов в
Ç
- клик
Advanced
страница
на Advanced
страница Редактор Диспетчера Соединений С Плоскими Файлами выполните следующие действия:
- установить имя to
ProductId
- установить ColumnDelimiter в
Ç
- установить тип to
Unicode string [DT_WSTR]
- установить длина to
30
- щелкните столбец
ListPrice
на Advanced
страница Редактор Диспетчера Соединений С Плоскими Файлами выполните следующие действия:
- установить имя to
ListPrice
- установить ColumnDelimiter to
{LF}
- установить тип to
numeric [DT_NUMERIC]
- установить DataPrecision to
12
- установить DataScale to
2
- клик
OK
перетащить Data Flow task
на Поток Управления tab и назовите его как File to database - With Cedilla delimiter
. Отключаем первую задачу потока данных.
настройте вторую задачу потока данных с помощью Flat File Source
и OLE DB Destination
дважды щелкните источник плоского файла, чтобы открыть Flat File Source Editor
. На Connection Manager
страница Редактор Источника "Неструктурированный Файл" выберите Диспетчер Соединений С Плоскими Файлами ProductListPrice_Cedilla
и нажмите кнопку колонки страница для настройки колонок. Нажмите OK
.
выполнить пакет. Все компоненты будут отображаться зеленым цветом, чтобы указать, что процесс прошел успешно, но строки не будут обработаны. Вы можете видеть, что между Flat File Source
и OLE DB Destination
выберите 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.
ответ выше, кажется ужасно сложным, просто конвертировать окончания строк в файле
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