कारण:
SSIS फ़ाइल को पढ़ने में विफल रहता है और स्तंभ सीमांकक Ç
के कारण नीचे दी गई चेतावनी प्रदर्शित करता है ("c" सेडिला के साथ ) और 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
. का उपयोग करके समस्या का समाधान कैसे किया जाता है और अंत में एक और उदाहरण है जो आपकी समस्या का अनुकरण करता है।
संकल्प:
नीचे नमूना पैकेज SSIS 2008 R2
में लिखा गया है . यह पंक्ति सीमांकक के साथ एक फ्लैट फ़ाइल पढ़ता है {LF}
एकल स्तंभ मान के रूप में; फिर Script Component
. का उपयोग करके डेटा को विभाजित करता है SQL Server 2008 R2
में तालिका में जानकारी सम्मिलित करने के लिए डेटाबेस।
नोटपैड++ का उपयोग करें
कुछ पंक्तियों के साथ एक साधारण फ्लैट फ़ाइल बनाने के लिए। नीचे दी गई नमूना फ़ाइल में उत्पाद आईडी है और सूची मूल्य Ç
. द्वारा अलग की गई प्रत्येक पंक्ति की जानकारी स्तंभ सीमांकक के रूप में और प्रत्येक पंक्ति {LF}
. के साथ समाप्त होती है सीमांकक।
Notepad++ पर, Encoding
पर क्लिक करें और फिर Encoding in UTF-8
. पर क्लिक करें फ़्लैट फ़ाइल को UTF-8
. में सहेजने के लिए एन्कोडिंग।
नमूना SQL Server 2008 R2
का उपयोग करेगा डेटाबेस नाम Sora
. dbo.ProductListPrice
. नामक एक नई तालिका बनाएं नीचे दी गई स्क्रिप्ट का उपयोग करना। SSIS इस तालिका में फ़्लैट फ़ाइल डेटा सम्मिलित करेगा।
USE Sora;
GO
CREATE TABLE dbo.ProductListPrice
(
ProductId nvarchar(30) NOT NULL
, ListPrice numeric(12,2) NOT NULL
);
GO
बिजनेस इंटेलिजेंस डेवलपमेंट स्टूडियो (BIDS) 2008 R2 का उपयोग करके एक SSIS पैकेज बनाएं . पैकेज को SO_6268205.dtsx
. नाम दें . Sora.ds
. नाम का डेटा स्रोत बनाएं डेटाबेस से कनेक्ट करने के लिए Sora
SQL सर्वर 2008 R2 में ।
पैकेज के अंदर कहीं भी राइट-क्लिक करें और फिर Variables
. पर क्लिक करें चर फलक देखने के लिए। ColumnDelimiter
. नाम से एक नया वेरिएबल बनाएं डेटा प्रकार का String
पैकेज के दायरे में SO_6268205
और वैरिएबल को Ç
. मान के साथ सेट करें
Connection Managers
पर राइट-क्लिक करें और क्लिक करें New Flat File Connection...
फ़्लैट फ़ाइल पढ़ने के लिए कनेक्शन बनाने के लिए।
General
. पर फ्लैट फ़ाइल कनेक्शन प्रबंधक संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें:
- सेट करें कनेक्शन प्रबंधक का नाम करने के लिए
ProductListPrice
- सेट विवरण उत्पाद सूची मूल्य जानकारी पढ़ने के लिए
Flat file connection manager to read product list price information.
- फ्लैट फ़ाइल पथ का चयन करें। मेरे पास पथ में फ़ाइल है
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
{LF}
चुनें शीर्षलेख पंक्ति सीमांकक . सेColumn names in the first data row
- क्लिक करें
Columns
पेज
Columns
. पर फ्लैट फ़ाइल कनेक्शन प्रबंधक संपादक . का पृष्ठ , सत्यापित करें कि Column delimiter
खाली और अक्षम है। Advanced
क्लिक करें पेज.
Advanced
. पर फ्लैट फ़ाइल कनेक्शन प्रबंधक संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें।
- नाम सेट करें करने के लिए
LineData
- सत्यापित करें कि स्तंभ सीमांकक
{LF}
. पर सेट है - डेटा प्रकार सेट करें करने के लिए
Unicode string [DT_WSTR]
- OutputColumnWidth सेट करें करने के लिए
255
Preview
पर क्लिक करें पेज.
Preview
. पर फ्लैट फ़ाइल कनेक्शन प्रबंधक संपादक . का पृष्ठ , सत्यापित करें कि प्रदर्शित डेटा सही दिखता है और OK
. पर क्लिक करें ।
आप डेटा स्रोत देखेंगे सोरा और फ्लैट फ़ाइल कनेक्शन प्रबंधक ProductListPrice Connection Managers
. पर पैकेज के नीचे टैब।
Data Flow Task
को खींचें और छोड़ें नियंत्रण प्रवाह . पर पैकेज का टैब और इसे नाम दें File to database - Without Cedilla delimiter
डेटा प्रवाह कार्य पर डबल-क्लिक करें दृश्य को Data Flow
. पर स्विच करने के लिए पैकेज पर टैब। एक Flat File Source
को खींचें और छोड़ें डेटा प्रवाह . पर टैब। फ्लैट फ़ाइल स्रोत पर डबल-क्लिक करें खोलने के लिए Flat File Source Editor
।
Connection Manager
. पर फ्लैट फ़ाइल स्रोत संपादक . का पृष्ठ , फ्लैट फ़ाइल कनेक्शन प्रबंधक . चुनें ProductListPrice
और कॉलम क्लिक करें पेज.
Columns
. पर फ्लैट फ़ाइल स्रोत संपादक . का पृष्ठ , कॉलम देखें LineData
और क्लिक करें OK
।
Script Component
को खींचें और छोड़ें डेटा प्रवाह . पर फ्लैट फ़ाइल स्रोत . के नीचे टैब , चुनें Transformation
और क्लिक करें OK
. फ्लैट फ़ाइल स्रोत . से हरा तीर कनेक्ट करें स्क्रिप्ट घटक . के लिए . स्क्रिप्ट घटक पर डबल-क्लिक करें खोलने के लिए Script Transformation Editor
।
इनपुट कॉलम पर क्लिक करें स्क्रिप्ट परिवर्तन संपादक . पर और LineData
. चुनें कॉलम। इनपुट और आउटपुट पर क्लिक करें पेज.
Inputs and Outputs
पर स्क्रिप्ट परिवर्तन संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें।
- इनपुट नाम को FlatFileInput में बदलें
- आउटपुट का नाम बदलकर
SplitDataOutput
. करें - आउटपुट कॉलम चुनें और
Add Column
. पर क्लिक करें . एक और कॉलम जोड़ने के लिए इसे दोबारा दोहराएं। - पहले कॉलम को नाम दें
ProductId
- डेटा प्रकार सेट करें कॉलम ProductId . का करने के लिए
Unicode string [DT_WSTR]
- लंबाई सेट करें करने के लिए
30
Inputs and Outputs
पर स्क्रिप्ट परिवर्तन संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें।
- दूसरे कॉलम को नाम दें
ListPrice
- डेटा प्रकार सेट करें कॉलम का सूची मूल्य से
numeric [DT_NUMERIC]
- परिशुद्धता सेट करें करने के लिए
12
- पैमाना सेट करें करने के लिए
2
- स्क्रिप्टक्लिक करें पृष्ठ स्क्रिप्ट को संशोधित करने के लिए
Script
. पर स्क्रिप्ट परिवर्तन संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें।
- केवल पढ़ने योग्य चर के सामने दीर्घवृत्त बटन क्लिक करें और वेरिएबल का चयन करें
User::ColumnDelimiter
- क्लिक करें
Edit Script...
नीचे दिए गए C# को Script Editor में पेस्ट करें। स्क्रिप्ट निम्नलिखित कार्य करती है।
- स्तंभ सीमांकक मान का उपयोग करना
Ç
चर में परिभाषित उपयोगकर्ता::ColumnDelimiter , विधिFlatFileInput_ProcessInputRow
आने वाले मान को विभाजित करता है और इसे स्क्रिप्ट घटक परिवर्तन में परिभाषित दो आउटपुट कॉलम में असाइन करता है।
सी#में स्क्रिप्ट घटक कोड
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
डेटा प्रवाह . पर टैब। स्क्रिप्ट घटक . से हरा तीर कनेक्ट करें 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 सर्वर प्रबंधन स्टूडियो (SSMS) . में तालिका में पंक्तियों की संख्या ज्ञात करने के लिए। पैकेज को क्रियान्वित करने से पहले यह खाली होना चाहिए।
पैकेज निष्पादित करें। आप देखेंगे कि पैकेज सफलतापूर्वक संसाधित हुआ 9 पंक्तियाँ। फ़्लैट फ़ाइल में 10 . है पंक्तियाँ लेकिन पहली पंक्ति स्तंभ नामों के साथ शीर्षलेख है।
क्वेरी निष्पादित करें select * from dbo.ProductListPrice
SQL सर्वर प्रबंधन स्टूडियो (SSMS) . में 9 . को खोजने के लिए पंक्तियों को तालिका में सफलतापूर्वक डाला गया। डेटा फ्लैट फ़ाइल डेटा से मेल खाना चाहिए।
ऊपर दिए गए उदाहरण में बताया गया है कि स्क्रिप्ट घटक . का उपयोग करके डेटा को मैन्युअल रूप से कैसे विभाजित किया जाए क्योंकि फ्लैट फ़ाइल कनेक्शन प्रबंधक स्तंभ सीमांकक कॉन्फ़िगर करते समय त्रुटि का सामना करना पड़ता है Ç
समस्या सिमुलेशन:
यह उदाहरण एक अलग फ्लैट फ़ाइल कनेक्शन प्रबंधक . दिखाता है स्तंभ सीमांकक के साथ कॉन्फ़िगर किया गया Ç
, जो निष्पादित करता है लेकिन चेतावनी का सामना करता है और किसी भी लाइन को संसाधित नहीं करता है।
Connection Managers
पर राइट-क्लिक करें और क्लिक करें New Flat File Connection...
फ्लैट फ़ाइल को पढ़ने के लिए एक कनेक्शन बनाने के लिए। General
. पर फ्लैट फ़ाइल कनेक्शन प्रबंधक संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें:
- सेट करें कनेक्शन प्रबंधक का नाम करने के लिए
ProductListPrice_Cedilla
- विवरण को
Flat file connection manager with Cedilla column delimiter.
- मेरे पास पथ में फ़ाइल है
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
समतल फ़ाइल पथ का चयन करें। {LF}
चुनें शीर्षलेख पंक्ति सीमांकक . सेColumn names in the first data row
- क्लिक करें
Columns
पेज
Columns
. पर फ्लैट फ़ाइल कनेक्शन प्रबंधक संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें:
- पंक्ति सीमांकक सेट करें करने के लिए
{LF}
- स्तंभ सीमांकक फ़ील्ड अक्षम किया जा सकता है।
Reset Columns
Click पर क्लिक करें - स्तंभ सीमांकक सेट करें करने के लिए
Ç
- क्लिक करें
Advanced
पेज
Advanced
. पर फ्लैट फ़ाइल कनेक्शन प्रबंधक संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें:
- नाम सेट करें करने के लिए
ProductId
- कॉलम डिलीमीटर सेट करें करने के लिए
Ç
- डेटा प्रकार सेट करें करने के लिए
Unicode string [DT_WSTR]
- लंबाई सेट करें करने के लिए
30
- कॉलम पर क्लिक करें
ListPrice
Advanced
. पर फ्लैट फ़ाइल कनेक्शन प्रबंधक संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें:
- नाम सेट करें करने के लिए
ListPrice
- कॉलम डिलीमीटर सेट करें करने के लिए
{LF}
- डेटा प्रकार सेट करें से
numeric [DT_NUMERIC]
- डेटा प्रेसिजन सेट करें करने के लिए
12
- डेटा स्केल सेट करें करने के लिए
2
- क्लिक करें
OK
किसी Data Flow Task
को खींचें और छोड़ें नियंत्रण प्रवाह . पर टैब और इसे नाम दें 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
पर क्लिक करें टैब और आप निम्न चेतावनी संदेश देखेंगे।
[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.