معظم إدراج ملف مع حقل نص مع حرف إرجاع (يدخل)
-
22-07-2019 - |
سؤال
وأنا تواجه مشكلة مع معظم إدراج ملف يحتوي على حقل في نوع البيانات النص، وأنه يحمل يدخل ومحدد للحقول وأنابيب "|" وفاصل الصف "| \ ن"
وأحصل على خطأ من اقتطاع للحقول بجوار حقل النص. أعتقد أن إدراج مجمعة يعتقد أن يدخل في الحقل الثاني هي الصفوف التالية.
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)، اعتمادا على ما إذا كان الملف يونكس، 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)
، بعض |
.
إذا كان الأمر كذلك، ثم عليك ان تحصل على تنسيق ملف لتعامل مع كل "عمود" منفصل.