2009-11-06 24 views
5

dizesine zorlayın. Csv dosyasını oledb kullanarak bir veri tabanına yüklemeye çalışıyorum.csv'yi oleDB'ye yükleyin ve tüm çıkarılan veri türlerini

Bu sorun değil, ancak sayısal olarak görünen alanlardan biri alanların yaklaşık% 3'ünde bir dize değerine sahiptir ve bu nedenle doldurulmamaktadır.

csv'yi xml'ye dönüştürdüğümden dolayı, gerçekten veri türleri hakkında bilgi sahibi olma umurumda değil ve daha sonra bir Linq2XMl aşamasında kullanabileceğim gibi bir dizede verilere ihtiyacım var.

Bunu bağlantı dizesinde yapabilmeyi umuyorum.

Tabloyu kopyalamak, istediğim veri türü ile yeni sütunlarla ayarlamak ve daha sonra csv dosyasını iki kez yüklemeyi içereceğinden veriyi içine yazmak istemiyorum.

herhangi bir fikir?

benim şimdiki bağlantı dizesi

Sağlayıcı = Microsoft.Jet.OLEDB.4.0 olduğu; Data Source =" + thefile.DirectoryName + "; Extended Properties = 'text; HDR = Evet; FMT Ayrılmış ='"; .. bir DataTable CSV okuma için

cevap

6

Bazı araştırmalar yapıldı ve cevap bir schema.ini kullanıldı ancak veri kümeniz için anında oluşturuldu.

http://msdn.microsoft.com/en-us/library/ms709353(VS.85).aspx

gerekli bilgi içermektedir. şemayı oluşturmak için:

public static void ConstructSchema(FileInfo theFile) 
    { 
     StringBuilder schema = new StringBuilder(); 
     DataTable data = LoadCSV(theFile); 
     schema.AppendLine("[" + theFile.Name + "]"); 
     schema.AppendLine("ColNameHeader=True"); 
     for (int i = 0; i < data.Columns.Count; i++) 
     { 
      schema.AppendLine("col" + (i + 1).ToString() + "=" + data.Columns[i].ColumnName + " Text"); 
     } 
     string schemaFileName = theFile.DirectoryName + @"\Schema.ini"; 
     TextWriter tw = new StreamWriter(schemaFileName); 
     tw.WriteLine(schema.ToString()); 
     tw.Close(); 
    } 

hasta o kütüphaneyi kontrol edecek, xml

public static XElement GetXMLFromCSV(FileInfo theFile, string rootNodeName, string itemName) 
    { 
     XElement retVal; 
     DataTable data; 
     data = CrateCsvAndSchema(theFile); 
     DataSet ds = new DataSet(rootNodeName); 
     data.TableName = itemName; 
     ds.Tables.Add(data); 
     retVal = XElement.Parse(ds.GetXml()); 
     return retVal; 
    } 
+1

Eski bir soruyu sürüklemekten ötürü özür dilerim ama bu csv ** 'yi yüklemeden önce ** bir schema.ini dosyası var ve LoadCSV'yi çağırdığınızda veri kümenizi yanlış verilerle tekrar yüklüyor musunuz? Sonuçta, oluşturulan schema.ini no'yu gerçekten kullanmak için loadcsv'yi tekrar aramak zorunda kalacaksınız. – DannyT

+0

Şema dosyasını oluşturmak için csv dosyasını yükledikten sonra veriyi almak için tekrar yükleyin.Buradaki kod, anahtar parçaların sadece parçacıklarıdır. –

+0

bu benim için çalışıyor. Teşekkürler. –

0

tavsiye bu CSV parser

kullanımı gerçekten çok kolay Burada bir virgül verilerle bir DataTable doldurmak için kullanabilirsiniz nasıl, alıntı CSV nitelikli:

DataTable dt = null; 
    using (GenericParserAdapter gp = new GenericParser.GenericParserAdapter(yourCsvFullname)) { 
     dt = gp.GetDataTable(); 
    } 

Ayarlayabileceğiniz bir dizi seçenek vardır: sınırlayıcı, CSV sütununda ilk satırların sütun başlıklarının (eğer doğruysa, DataTable'ınızdaki her DataColumn buna göre adlandırılacaktır) vb.

Orada bir dizi hızlı, esnek CSV ayrıştırıcısı var, ancak basit gereksinimler için bu bir daha yenilmez.

+0

teşekkür dönüştürmek için datatable

public static DataTable LoadCSV(FileInfo theFile) { string sqlString = "Select * FROM [" + theFile.Name + "];"; string conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + theFile.DirectoryName + ";" + "Extended Properties='text;HDR=YES;'"; DataTable theCSV = new DataTable(); using (OleDbConnection conn = new OleDbConnection(conStr)) { using (OleDbCommand comm = new OleDbCommand(sqlString, conn)) { using (OleDbDataAdapter adapter = new OleDbDataAdapter(comm)) { adapter.Fill(theCSV); } } } return theCSV; } 

olarak csv yüklemek için. Gerçekten bunu mümkün değilse harici dell kullanmadan çözmek istiyorum. Ama teşekkürler. –

+1

Bunun için harici DLL'lere ihtiyacınız yoktur. Makale, projenize dahil edebileceğiniz sınıfı içerir. –

İlgili konular