Импорт файла CSV, разделенного точкой с запятой - PullRequest
3 голосов
/ 09 мая 2019

У меня есть файл CSV, который я скачал с портала поставщика топлива. Данные разделены точками с запятой, перед строкой, в которой есть заголовки полей, содержится 11 строк комментариев.

enter image description here

имеет 3 строки сводки и кодируется в Unix LF

enter image description here

Я использовал команды SQL BULK INSERT для импорта другого файла данных от другого поставщика: -

BULK INSERT [dbo].[fuel_stagingShell]
FROM '\\server\path\dataimports\fueldata\Shell\results.csv'
WITH
(
    FORMAT = 'CSV',
    FIELDQUOTE ='"',
    FIRSTROW=2,
    FIELDTERMINATOR = ',',
    ROWTERMINATOR='\n',
    TABLOCK
)

Что идеально, поскольку он импортирует файл за доли секунды.

Однако, когда я пытаюсь вставить BULK INSERT, он не будет работать с этим файлом. Да, я могу пропустить строки заголовка, изменив FIRSTROW, однако существует проблема трех строк в конце файла. Параметру LASTROW в команде BULK INSERT требуется номер строки, который я не знаю, поскольку файлы имеют переменную длину.

Я думал об импорте файла в C #, пропуская первые 11 строк, заканчивая, когда я попадаю в строку, начинающуюся с «Всего»; и сопоставление столбцов на основе имен заголовков.

Есть ли способ, которым я мог бы импортировать строки данных и разделить их на массив / POCO / что-то еще, это действительно простой и очевидный способ сделать это, если вы знаете, что это доступно?

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

РЕДАКТИРОВАТЬ: Я повторил проблему, чтобы я мог редактировать этот пост с ошибкой, с которой я столкнулся с файлом, и этот парень получает то же сообщение об ошибке ("IID_IColumnsInfo") ошибка с SQL Server BULK INSERT файла CSV , поэтому я заменил \ n на 0x0a и добавил произвольный параметр LASTROW, на что намекает @steve в комментариях, а когда я закомментировал параметр FIELDQUOTE, он импортировал загрузку строки.

Теперь я думаю, что мог бы предварительно проанализировать файл и посчитать, сколько там строк, и встроить его в динамический SQL из моего приложения. ИЛИ, изменяя мою промежуточную таблицу с более длинными полями varchar, которые будут принимать все биты комментария в конце файла и игнорировать их в хранимой процедуре T-SQL, которая проверяет данные и преобразует их в таблицу транзакций.

Вот T-SQL, который я использовал:

BULK INSERT [dbo].[fuel_stagingDkv]
FROM '\\server\path\dataimports\fueldata\DKV\Results.csv'
WITH
(
FORMAT = 'CSV',
--FIELDQUOTE ='',
FIRSTROW=12,
LASTROW=5000,
FIELDTERMINATOR = ';',
ROWTERMINATOR='0x0a',
TABLOCK
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...