2010-06-24 9 views
6

मैं एक डीटीएस में यह कर के बाद से एक Microsoft SQL सर्वर 2000जब सी # में OLEDB के माध्यम से CSV फ़ाइल आयात किए परिसीमक निर्दिष्ट कैसे

में एक जटिल आयात करने की जरूरत है जटिल, मैं कोशिश कर रहा हूँ यह थोड़ा सी # प्रोग्राम के साथ है, लेकिन मुझे CSV फ़ाइलों को आयात करने की आवश्यकता होने पर समस्याएं आ रही हैं: यह फ़ाइल अर्धविरामों को अल्पविरामों के बजाय फ़ील्ड डिलीमीटर के रूप में उपयोग कर रही है और मुझे इसे पहचानने के लिए .NET के OLE DB प्रदाता को नहीं मिल रहा है।

मुझे पहले से ही Extended Properties="Text; Format=Delimited" या `विस्तारित गुण =" टेक्स्ट; प्रारूप = सीमित (;) "in the connection string or using a schema.ini` फ़ाइल का उपयोग करने के लिए नेट पर विभिन्न" समाधान "मिलते हैं।

DataTable Table = new DataTable(); 

using (OleDbConnection Connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=\"Text;HDR=Yes;Format=Delimited\"")) 
{ 
    Connection.Open(); 

    using (OleDbCommand Command = Connection.CreateCommand()) 
    { 
     Command.CommandText = "select [Field 1], [Field 2] from [file.csv]"; 

     using (OleDbDataAdapter Adapter = new OleDbDataAdapter(Command)) 
     { 
      Adapter.Fill(Table); 
     } 
    } 
} 

using (SqlConnection Connection = new SqlConnection("Data Source=server; Initial Catalog=database; User Id=user; Password=password;")) 
{ 
    Connection.Open(); 

    using (SqlCommand Command = Connection.CreateCommand()) 
    { 
     Command.CommandText = "insert into [table] ([field_1], [field_2], ...) values (@field_1, @field_2, ...)"; 

     Command.Parameters.Add("field_1", SqlDbType.Date, 0, "Field 1"); 
     Command.Parameters.Add("field_2", SqlDbType.VarChar, 100, "Field 2"); 
     ... 

     using (SqlDataAdapter Adapter = new SqlDataAdapter()) 
     { 
      Adapter.InsertCommand = Command; 

      Adapter.Update(Table); 
     } 
    } 
} 

कैसे क्षेत्र विभाजक के रूप में अर्धविराम का उपयोग कर प्राप्त करने के लिए पर कोई भी विचार बाहरी libriaries पर निर्भर रहे बिना:

यह वास्तविक कोड मैं का उपयोग कर रहा है?

नोट्स:

  1. "बाहरी libriaries पर निर्भर रहे बिना" सा है, क्योंकि मैं सीधे डेटाबेस और कोई पुस्तकालय मैं यह कर सकता पाया (वे सूत्र), और हमारे पीएचबी में फ़ाइल आयात करने की जरूरत है एक वाणिज्यिक समाधान के लिए भी एक पैसा नहीं छोड़ेंगे।
  2. मुझे पता है कि मैं एक डीटीएस के माध्यम से फ़ाइल आयात कर सकता हूं, लेकिन मुझे आयात से पहले और बाद में वर्कफ़्लो और फ़ाइल परिवर्तनों पर जटिल ब्रांचिंग करने की आवश्यकता है, और इसके परिणामस्वरूप डीटीएस में और बाहर कूदना होगा।
  3. डीटीएस के अंदर सबकुछ करना व्यावहारिक नहीं होगा मेरे लिए, क्योंकि मैं ActiveX और VBScript कोडिंग में कुशल नहीं हूं।

अग्रिम धन्यवाद, एंड्रिया।

संपादित करें 1 - @andyb: schema.ini दृष्टिकोण के लिए टेस्ट प्रोग्राम कोड:

String ConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=\"Text\"", Environment.CurrentDirectory); 

DataTable Table = new DataTable(); 

using (OleDbConnection Connection = new OleDbConnection(ConnectionString)) 
{ 
    Connection.Open(); 

    using (OleDbCommand Command = Connection.CreateCommand()) 
    { 
     Command.CommandText = "select * from [file.csv]"; 

     using (OleDbDataAdapter Adapter = new OleDbDataAdapter(Command)) 
     { 
      Adapter.Fill(Table); 
     } 
    } 
} 
+0

आपका कोड SqlConnection स्ट्रिंग के अंदर OleDbConnection स्ट्रिंग और ओएलई डीबी प्रदाता वाक्यविन्यास के लिए SQL प्रदाता वाक्यविन्यास का उपयोग करता है। क्या यह समस्या हो सकती है? –

+0

@Panagiotis Kanavos: कट और पेस्ट त्रुटि, सही। – Albireo

उत्तर

12

टिप्पणीकार सही है कि आप अपने प्रदाता वाक्य रचना गलत तरीके से गोल है।

हालांकि, यह समस्या नहीं है। दुर्भाग्यवश, आप अपने oledb कनेक्शन स्ट्रिंग में कस्टम डिलीमीटर निर्दिष्ट नहीं कर सकते हैं। इसके बजाय, अपने स्रोत निम्नलिखित युक्त फ़ाइल उसी निर्देशिका में कोई Schema.ini फ़ाइल बनाएँ:

[file.csv] 
Format=Delimited(;) 

अनाड़ी, लेकिन यह काम करता है।

+0

हाय, मैंने पहले ही 'schema.ini' दृष्टिकोण की कोशिश की है, लेकिन यह काम नहीं कर रहा है, मुझे अभी भी एक कॉलम आयात मिलता है। आप उस कोड को पा सकते हैं जिसका उपयोग मैं संपादित प्रश्न के शरीर में एक नए परीक्षण कार्यक्रम में किया जाता हूं। – Albireo

+0

मैंने अभी आपके कोड की प्रतिलिपि बनाई है और डेटाटेबल पूछताछ की है और यह अभी भी मेरे लिए काम कर रहा है। यह पूछने के लिए खेद है, लेकिन क्या आपके पास schema.ini में सही फ़ाइल नाम है? – andyb

+0

हां, मैंने इसे दो बार चेक किया और यह ठीक है। क्या यह हो सकता है कि इसमें कुछ दखल दे रहा है? : \ – Albireo

5

schema.ini फ़ाइल को यूनिकोड या एएनएसआई में सहेजा जाना है, यूटीएफ -8 के रूप में नहीं।

आपकी डेटा फ़ाइल को यूनिकोड नहीं यूटीएफ -8 के रूप में भी सहेजा जाना चाहिए। test.csv लाइन 0 पर [test.csv] पाठ के साथ एक Schema.ini होगा:

1

आप Schema.ini फ़ाइल (नहीं [file.csv], जैसे अंदर अपनी csv फ़ाइल नाम लिखने के लिए है

[test.csv] 
Format=Delimited(;) 
संबंधित मुद्दे