Thứ Năm, 19 tháng 11, 2009

Reading CSV file by OdbcConnection and C#

CSV là một text file thường được sử dụng để export dữ liệu từ một nguồn CSDL nào đó. Đặc điểm của nó là cấu trúc đơn giản, nhẹ. Tuy nhiên, trong trường hợp người dùng muốn import dữ liệu từ CSV nó sẽ phát sinh một số vấn đề như các ký tự đặc biệt, các dấu xuống dòng,…khiến việc thao tác dữ liệu trên CSV là không chính xác. Bài viết dưới đây hướng dẫn sử dụng OdbcConnection và C# để đọc một CSV một cách chính xác.

1. Chúng ta sử dụng OdbcConnection để kết nối tới CSV file

   1: public static List<GDTData> ReadCSV(string importFolder, string strFileName)
   2:         {
   3:             //string importFolder = @"D:\Windows.old\Work\Hyperlogy";
   4:             //string strFileName = "DN_HAN.CSV";            
   5:             string strConn = @"Driver={Microsoft Text Driver (*.txt; *.csv)};" +
   6:                                 "Dbq=" + importFolder + ";Extensions=csv,txt;";
   7:             List<GDTData> list = new List<GDTData>();
   8:             try
   9:             {
  10:                 OdbcConnection objCSV = new OdbcConnection(strConn);
  11:                 objCSV.Open();
  12:  
  13:                 OdbcCommand oCmd = new OdbcCommand("select * from " + strFileName, objCSV);
  14:                 OdbcDataReader oDR = oCmd.ExecuteReader();
  15:                 int count = 0;
  16:                 while (oDR.Read())
  17:                 {
  18:                     GDTData data = new GDTData();
  19:                     // Do something
  20:                     data.Id = count;
  21:                     data.Cot1 = oDR[0].ToString();
  22:                     data.Cot12 = oDR[11].ToString();
  23:                     list.Add(data);
  24:                     count = count + 1;
  25:                 }
  26:                 oDR.Close();
  27:                 oCmd.Dispose();
  28:                 objCSV.Close();
  29:                 Console.WriteLine(count);               
  30:                 return list;
  31:             }
  32:             catch(Exception ex) {
  33:                 Console.WriteLine(ex.ToString());
  34:                 return list;
  35:             }


2. Với method trên hoàn toàn chúng ta đã đọc được csv file. Tuy nhiên, kết quả cho thấy, hàng đầu tiên của file CSV sẽ không được đọc ra. Đó là bởi vì OdbcConnection hiểu rằng hàng đầu tiên đó là Header. Để khắc phục điều này chúng ta cần tạo ra một file schema.ini đặt cùng thư mục với file CSV với nội dụng như sau:






[DN_HAN.CSV]
ColNameHeader = False
Format = CSVDelimited
CharacterSet = ANSI


Chúng ta có thể thực hiện tự động điều này bằng code






   1: public static void WriteIni(string folderUrl, string fileName)
   2:        {
   3:            StringBuilder sb = new StringBuilder();
   4:            sb.Append("[" + fileName + "]\n");
   5:            sb.Append("ColNameHeader = False\n");
   6:            sb.Append("Format = CSVDelimited\n");
   7:            sb.Append("CharacterSet = ANSI");
   8:            StreamWriter log = new StreamWriter(folderUrl+"\\schema.ini", false);
   9:            log.Write(sb.ToString());
  10:            log.Close();
  11:        }  


3. Cuối cùng khi sử dụng, chúng ta sẽ call method để sinh ra file schema.ini trước như sau






   1: string importFolder = @"D:\Windows.old\Work\Hyperlogy";
   2: string strFileName = "DN_HAN.CSV";
   3: WriteIni(importFolder, strFileName);    //Write Schema.ini
   4: List<GDTData> list = ReadCSV(importFolder, strFileName);
   5: ...


Chúc các bạn thành công.