basquang™ on clouds

November 19, 2009

Reading CSV file by OdbcConnection and C#

Filed under: Microsoft Technology — basquang @ 9:43 AM

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.

Advertisements

Leave a Comment »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Blog at WordPress.com.

%d bloggers like this: