软件编程
位置:首页>> 软件编程>> C#编程>> C# Csv实现基本的读写和转换DataTable

C# Csv实现基本的读写和转换DataTable

作者:海盗1234  发布时间:2023-11-20 10:55:22 

标签:C#,Csv,读写,转换,DataTable

Csv文件基本的属性

csv文件可以在excel或者wps中以表格形式打开,本质上是每一列以,逗号为分隔符的一种格式,在C#中操作可以把他当做普通txt文本读入,然后通过处理,逗号分隔符来对数据进行处理转换。
在表格中打开:

C# Csv实现基本的读写和转换DataTable


在记事本中打开:

C# Csv实现基本的读写和转换DataTable

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;
}

来源:https://blog.csdn.net/qq_39427511/article/details/128378751

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com