Reading CSV file by OdbcConnection and C#

  • Post author:
  • Post category:Blog
  • Post comments:0 Comments
  • Reading time:3 mins read

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

 public static List<GDTData> ReadCSV(string importFolder, string strFileName)
         {
             //string importFolder = @"D:\Windows.old\Work\Hyperlogy";
             //string strFileName = "DN_HAN.CSV";            
              string strConn = @"Driver={Microsoft Text Driver (*.txt; *.csv)};" +
                                 "Dbq=" + importFolder + ";Extensions=csv,txt;";
             List<GDTData> list = new List<GDTData>();
             try
             {
                 OdbcConnection objCSV = new OdbcConnection(strConn);
                 objCSV.Open();
  
                 OdbcCommand oCmd = new OdbcCommand("select * from " + strFileName, objCSV);
                 OdbcDataReader oDR = oCmd.ExecuteReader();
                 int count = 0;
                 while (oDR.Read())
                 {
                     GDTData data = new GDTData();
                     // Do something
                     data.Id = count;
                     data.Cot1 = oDR[0].ToString();
                     data.Cot12 = oDR[11].ToString();
                     list.Add(data);
                     count = count + 1;
                 }
                 oDR.Close();
                 oCmd.Dispose();
                 objCSV.Close();
                  Console.WriteLine(count);               
                 return list;
             }
             catch(Exception ex) {
                 Console.WriteLine(ex.ToString());
                 return list;
             }

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

public static void WriteIni(string folderUrl, string fileName)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("[" + fileName + "]\n");
            sb.Append("ColNameHeader = False\n");
            sb.Append("Format = CSVDelimited\n");
            sb.Append("CharacterSet = ANSI");
            StreamWriter log = new StreamWriter(folderUrl+"\\schema.ini", false);
            log.Write(sb.ToString());
            log.Close();
        }  

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

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

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

Leave a Reply