Массовая вставка файла с текстовым полем с возвратом каретки (вводит)

StackOverflow https://stackoverflow.com/questions/1645887

Вопрос

У меня возникли проблемы с массовой вставкой файла, который содержит поле в типе данных text, и в нем содержатся вводы, а разделителем для полей являются каналы "|", а ограничителем строки является "| \ n".

Я получаю ошибку усечения для полей рядом с текстовым полем.Я думаю, что массовая вставка считает, что вводимые данные во втором поле являются следующими строками.

DECLARE @sql varchar(2000)
PRINT 'xyz table'
SET @sql = 
'BULK INSERT xyz 
   FROM ''\\' + @@servername + '\Import\xyz.txt''
   WITH 
      (
                DATAFILETYPE   = ''char'',
                FIELDTERMINATOR         = ''|'',
                ROWTERMINATOR           = ''|\n'',
                TABLOCK,
                ROWS_PER_BATCH         = 2000,
                MAXERRORS      = 1000

                )
'
PRINT @sql
EXECUTE (@sql)
PRINT ''
GO

Это пример данных

467507**|**08-20-09\
[8:55:03 AM] *** miked@wkaiser-6793 is Not Available [Ext. away]\(CR)
[9:00:57 AM] *** miked@wkaiser-6793 is Online [Online]\(CR)
[9:01:00 AM] <jeffp> Howdy.  Time slip update game!  Update TS#467493 & 467507 with a (CR)comment and see if you win! [9:01:30 AM] *** miked@wkaiser-6793 is Away [Away]\
\(CR)
08-18-09\(CR)
[10:13:15 AM] *** miked@wkaiser-6793 is Online [Online]\(CR)
[10:13:59 AM] <jeffp> Howdy; welcome back from lunch..  Just pinging you for an update in TS#467493 & 467507.  Since 467493 is pri9, want a stock e-mail to go out to the customer to get them moving?\(CR)
[10:14:47 AM] <miked@wkaiser-6793> thats ok i got it\(CR)
[10:14:53 AM] <jeffp> Aiight.**|**2009-08-18 00:00:00**|**2009-08-20 00:00:00**|**JDP**|**JDP**|**

Схема таблицы является:

create table xyz
  (
    xyz_id VARCHAR(200), --INT TO VARCHAR
    notes text,
    create_date varchar(32), --DATETIME
    create_user varchar(12),
    modify_date varchar(32), --DATETIME
    modify_user varchar(12)
  )

Как вы можете видеть (ну, не можете видеть), есть вводы (помеченные CR), и массовая вставка путает их с новой строкой.

Любая помощь будет оценена по достоинству.

Спасибо

Это было полезно?

Решение

Редактировать:ты не надо нужен файл формата:

IF OBJECT_ID('tempdb..#rawdata') IS NOT NULL DROP TABLE #rawdata
create table #rawdata (
  xyz_id VARCHAR(200)
, notes text
, create_date varchar(32)
, modify_date varchar(32)
, create_user varchar(12)
, modify_user varchar(12)
)

BULK INSERT #rawdata 
FROM 'C:\temp\file.txt'
WITH (
    FIELDTERMINATOR = '**|**'
  , ROWTERMINATOR = '**|**\n'
  , TABLOCK
  )

SELECT * FROM #rawdata

Возможно, вам придется поиграть с **|**\n (LF) против **|**\r\n (CRLF) против **|**\r (CR), в зависимости от того, является ли файл похожим на Unix, DOS или MAC.

/РЕДАКТИРОВАТЬ

Это невозможно сделать без файла формата.Итак, создайте файл формата:

8.0
7
1 SQLCHAR 0 0 "**|**" 1 xyz_id        ""
2 SQLCHAR 0 0 "**|**" 2 notes         ""
3 SQLCHAR 0 0 "**|**" 3 create_date   ""
4 SQLCHAR 0 0 "**|**" 4 modify_date   ""
5 SQLCHAR 0 0 "**|**" 5 create_user   ""
6 SQLCHAR 0 0 "**|**" 6 modify_user   ""
7 SQLCHAR 0 0 "\n"    0 omitted       ""

Тогда:

IF OBJECT_ID('tempdb..#rawdata') IS NOT NULL DROP TABLE #rawdata
create table #rawdata (
  xyz_id VARCHAR(200)
, notes text
, create_date varchar(32)
, modify_date varchar(32)
, create_user varchar(12)
, modify_user varchar(12)
)

BULK INSERT #rawdata 
FROM '\\folder\file.txt'
WITH (
    FORMATFILE = '\\folder\file.fmt'
  , TABLOCK
  )

Или, в SQL 2005+:

SELECT * FROM OPENROWSET(
    BULK '\\folder\file.txt'
  , FORMATFILE = '\\folder\file.fmt'
  ) a

Другие советы

Эти данные противоречивы.У вас есть несколько строк, заканчивающихся \(cr) с одним полем, другим (cr) заканчивающийся на | разделители столбцов

Либо это, либо у вас несогласованные разделители столбцов, некоторые \(cr), некоторые |.Если это так, то вам понадобится форматировать файл разбираться с каждой отдельной "колонкой".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top