首頁 > 軟體

C# Csv實現基本的讀寫和轉換DataTable

2023-02-06 06:01:17

Csv檔案基本的屬性

csv檔案可以在excel或者wps中以表格形式開啟,本質上是每一列以,逗號為分隔符的一種格式,在C#中操作可以把他當做普通txt文字讀入,然後通過處理,逗號分隔符來對資料進行處理轉換。
在表格中開啟:


在記事本中開啟:

Csv讀寫方式

方式一:一次性讀寫

使用File.ReadAllLines一次性讀入。File.WriteAllLines一次性寫入。
這種方式適合csv檔案內容不多的情況下使用。
範例:

string path="data.csv";
 var lines = File.ReadAllLines(path).ToList();

完整的實現:

        /// <summary>
        /// 讀取Csv,返回行集合
        /// </summary>
        /// <param name="path"></param>
        /// <param name="hasTitle"></param>
        /// <returns></returns>
        public static List<string> ReadCsv(string path, bool hasTitle)
        {
            if (!File.Exists(path))
                return new List<string>();
            
            var lines = File.ReadAllLines(path).ToList();
            if (hasTitle)
            {
                lines.RemoveAt(0);
            }
            return lines;
        }

方式二:使用檔案流形式讀寫

使用StreamReader,一行一行的讀取檔案中的內容,並且處理。寫入類似
範例:

using (StreamReader sr = new StreamReader(path))
{

      string line;
      while ((line = sr.ReadLine()) != null)
      {
			//處理行資料
          
          
      }
  }

Csv檔案讀寫DataTable型別

將CSV檔案讀入資料轉成DataTable型別

 /// <summary>
 /// 讀取Csv檔案,載入到DataTable
 /// </summary>
 /// <param name="path">csv檔案路徑</param>
 /// <param name="hasTitle">是否有標題行</param>
 /// <param name="SafeLevel">安全等級:0:錯誤格式行正常新增;1:錯誤行忽略(不新增),2:出現錯誤彈出異常</param>
 /// <returns></returns>
 public static DataTable ReadCsvToDataTable(string path, bool hasTitle = false, int SafeLevel = 0)
 {

     DataTable dt = new DataTable();
     var lines = ReadCsv(path, false);
     bool isFirst = true;

     foreach (var item in lines)
     {
         string[] values = item.Split(',');
         if (isFirst)
         {
             for (int i = 0; i < values.Length; i++)
             {
                 dt.Columns.Add();
             }
             if (hasTitle)
             {
                 for (int i = 0; i < values.Length; i++)
                 {
                     dt.Columns[i].ColumnName = values[i];
                 }
                 continue;
             }
             isFirst = false;
         }
         if (values.Length == dt.Columns.Count)
         {
             dt.Rows.Add(values);
         }
         else
         {
             switch (SafeLevel)
             {
                 case 0:
                     if (values.Length > dt.Columns.Count)
                     {
                         var res = values.ToList();
                         res.RemoveRange(dt.Columns.Count, values.Length - dt.Columns.Count);
                         dt.Rows.Add(res.ToArray());
                     }
                     else
                     {
                         dt.Rows.Add(values);
                     }
                     break;
                 case 1:
                     continue;
                 default:
                     throw new Exception("CSV格式錯誤:表格各行列數不一致");
             }

         }
     }


     return dt;
 }

 /// <summary>
 /// 以檔案流形式讀取Csv檔案,載入到DataTable
 /// </summary>
 /// <param name="path">csv檔案路徑</param>
 /// <param name="hasTitle">是否有標題行</param>
 /// <param name="SafeLevel">安全等級:0:錯誤格式行正常新增;1:錯誤行忽略(不新增),2:出現錯誤彈出異常</param>
 /// <returns></returns>
 /// <exception cref="Exception"></exception>
 public static DataTable ReadCsvByStream(string path, bool hasTitle = false, int SafeLevel = 0)
 {
     DataTable dt = new DataTable();
     bool isFirst = true;

     using (StreamReader sr = new StreamReader(path))
     {

         string line;
         while ((line = sr.ReadLine()) != null)
         {

             string[] values = line.Split(',');
             if (isFirst)
             {
                 for (int i = 0; i < values.Length; i++)
                 {
                     dt.Columns.Add();
                 }
                 isFirst = false;
             }

             //有表頭則新增
             if (hasTitle)
             {
                 for (int i = 0; i < values.Length; i++)
                 {
                     dt.Columns[i].ColumnName = values[i];
                 }
                 hasTitle = false;
             }
             else
             {
                 if (values.Length == dt.Columns.Count)
                 {
                     dt.Rows.Add(values);
                 }
                 else
                 {
                     switch (SafeLevel)
                     {
                         case 0:
                             if (values.Length > dt.Columns.Count)
                             {
                                 var res = values.ToList();
                                 res.RemoveRange(dt.Columns.Count, values.Length - dt.Columns.Count);
                                 dt.Rows.Add(res.ToArray());
                             }
                             else
                             {
                                 dt.Rows.Add(values);
                             }
                             break;
                         case 1:
                             continue;
                         default:
                             throw new Exception("CSV格式錯誤:表格各行列數不一致");
                     }

                 }
             }
         }
     }

     return dt;
 }

將DataTable型別寫入到Csv檔案中去

/// <summary>
/// 以檔案流形式將DataTable寫入csv檔案
/// </summary>
/// <param name="dt"></param>
/// <param name="path"></param>
/// <param name="hasTitle"></param>
/// <returns></returns>
public static bool WriteToCsvByDataTable(DataTable dt, string path, bool hasTitle = false)
{
    using (StreamWriter sw = new StreamWriter(path))
    {
        //輸出標題行(如果有)
        if (hasTitle)
        {
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                sw.Write(dt.Columns[i].ColumnName);
                if (i != dt.Columns.Count - 1)
                {
                    sw.Write(",");
                }
            }
            sw.WriteLine();
        }

        //輸出檔案內容
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                sw.Write(dt.Rows[i][j].ToString());
                if (j != dt.Columns.Count - 1)
                {
                    sw.Write(",");
                }
            }
            sw.WriteLine();
        }
    }

    return true;
}

到此這篇關於C# Csv實現基本的讀寫和轉換DataTable的文章就介紹到這了,更多相關C# Csv讀寫和轉換DataTable內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com