2009-11-06 9 views
5

Tôi đang cố gắng tải một tệp csv vào một dữ liệu có thể sử dụng được bằng oledb.Tải csv vào oleDB và buộc tất cả các kiểu dữ liệu được phỏng đoán thành chuỗi

Đây không phải là vấn đề nhưng tiếc là một trong các trường có dạng số có giá trị chuỗi trong khoảng 3% trường và do đó không được điền.

vì im chuyển đổi csv thành xml tôi thực sự không quan tâm đến việc suy ra các kiểu dữ liệu và chỉ cần dữ liệu trong chuỗi như tôi có thể truyền sau trong giai đoạn Linq2XMl.

Tôi hy vọng có thể thực hiện việc này trong chuỗi kết nối.

Tôi không muốn chỉ sao chép bảng, thiết lập nó với các cột mới với kiểu dữ liệu mà tôi muốn và sau đó ghi dữ liệu vào nó vì điều đó sẽ liên quan đến việc tải tệp csv hai lần.

bất kỳ ý tưởng nào?

chuỗi kết nối hiện tại của tôi là

Provider = Microsoft.Jet.OLEDB.4.0; Data Source =" + thefile.DirectoryName + "; Mở rộng thuộc tính = 'text; HDR = Yes; FMT = Delimited"; ..

Trả lời

6

Đã thực hiện một số nghiên cứu và câu trả lời là sử dụng schema.ini nhưng tạo nó ngay lập tức cho tập dữ liệu của bạn.

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

chứa thông tin bắt buộc. để xây dựng giản đồ:

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(); 
    } 

để nạp csv như 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; 
    } 

chuyển đổi sang 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

Xin lỗi vì đã kéo một câu hỏi cũ nhưng chắc chắn điều này tải csv ** trước ** có tệp schema.ini và khi bạn gọi LoadCSV, bạn đang tải dữ liệu không chính xác của mình lại với dữ liệu không chính xác? Cuối cùng bạn sẽ phải gọi loadcsv một lần nữa để thực sự sử dụng schema.ini được tạo ra không? – DannyT

+0

tôi tải csv để tạo tệp lược đồ rồi tải lại tệp đó để lấy dữ liệu.đọc liên kết tới bài viết trên microsoft về cách tệp lược đồ hoạt động.Đoạn mã ở đây chỉ là các đoạn của các phần chính thực sự. –

+0

tính năng này đang hoạt động đối với tôi. Cảm ơn. –

0

Đối với đọc một CSV vào một DataTable tôi khuyên này CSV parser

nó thực sự dễ sử dụng đây là cách bạn có thể sử dụng nó để điền vào một DataTable với dữ liệu từ một dấu phẩy phân cách, trích dẫn đủ điều kiện CSV:

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

Có một số tùy chọn mà bạn có thể đặt: dấu phân cách, ký tự xếp hạng văn bản cho biết dòng đầu tiên trong tiêu đề cột hiển thị CSV (nếu đúng, mỗi DataColumn trong DataTable của bạn sẽ được đặt tên tương ứng), v.v.

Có một số trình phân tích cú pháp CSV nhanh, linh hoạt ngoài đó nhưng đối với các yêu cầu đơn giản, bạn không thể đánh bại được.

+0

thankyou, bệnh sẽ kiểm tra thư viện mà ra. Tôi thực sự muốn giải quyết điều này mà không cần sử dụng các dll bên ngoài nếu có thể. Nhưng cảm ơn. –

+1

Bạn không cần DLL bên ngoài cho việc này. Bài viết bao gồm lớp mà bạn có thể đưa vào dự án của mình. –

Các vấn đề liên quan