溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#中Csv怎么實(shí)現(xiàn)基本的讀寫和轉(zhuǎn)換

發(fā)布時(shí)間:2023-02-07 09:23:09 來源:億速云 閱讀:125 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“C#中Csv怎么實(shí)現(xiàn)基本的讀寫和轉(zhuǎn)換”,在日常操作中,相信很多人在C#中Csv怎么實(shí)現(xiàn)基本的讀寫和轉(zhuǎn)換問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C#中Csv怎么實(shí)現(xiàn)基本的讀寫和轉(zhuǎn)換”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

Csv文件基本的屬性

csv文件可以在excel或者wps中以表格形式打開,本質(zhì)上是每一列以,逗號為分隔符的一種格式,在C#中操作可以把他當(dāng)做普通txt文本讀入,然后通過處理,逗號分隔符來對數(shù)據(jù)進(jìn)行處理轉(zhuǎn)換。
在表格中打開:

C#中Csv怎么實(shí)現(xiàn)基本的讀寫和轉(zhuǎn)換


在記事本中打開:

C#中Csv怎么實(shí)現(xiàn)基本的讀寫和轉(zhuǎn)換

Csv讀寫方式

方式一:一次性讀寫

使用File.ReadAllLines一次性讀入。File.WriteAllLines一次性寫入。
這種方式適合csv文件內(nèi)容不多的情況下使用。
示例:

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

完整的實(shí)現(xiàn):

        /// <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,一行一行的讀取文件中的內(nèi)容,并且處理。寫入類似
示例:

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

      string line;
      while ((line = sr.ReadLine()) != null)
      {
			//處理行數(shù)據(jù)
          
          
      }
  }

Csv文件讀寫DataTable類型

將CSV文件讀入數(shù)據(jù)轉(zhuǎn)成DataTable類型

 /// <summary>
 /// 讀取Csv文件,加載到DataTable
 /// </summary>
 /// <param name="path">csv文件路徑</param>
 /// <param name="hasTitle">是否有標(biāo)題行</param>
 /// <param name="SafeLevel">安全等級:0:錯(cuò)誤格式行正常添加;1:錯(cuò)誤行忽略(不添加),2:出現(xiàn)錯(cuò)誤彈出異常</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格式錯(cuò)誤:表格各行列數(shù)不一致");
             }

         }
     }


     return dt;
 }

 /// <summary>
 /// 以文件流形式讀取Csv文件,加載到DataTable
 /// </summary>
 /// <param name="path">csv文件路徑</param>
 /// <param name="hasTitle">是否有標(biāo)題行</param>
 /// <param name="SafeLevel">安全等級:0:錯(cuò)誤格式行正常添加;1:錯(cuò)誤行忽略(不添加),2:出現(xiàn)錯(cuò)誤彈出異常</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格式錯(cuò)誤:表格各行列數(shù)不一致");
                     }

                 }
             }
         }
     }

     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))
    {
        //輸出標(biāo)題行(如果有)
        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();
        }

        //輸出文件內(nèi)容
        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;
}

到此,關(guān)于“C#中Csv怎么實(shí)現(xiàn)基本的讀寫和轉(zhuǎn)換”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

csv
AI