it编程 > 编程语言 > Asp.net

C#操作CSV文件的详细教程

21人参与 2026-01-23 Asp.net

一、csv 格式详解

基本语法

编码格式

常见的 csv 文件编码有 utf - 8、gbk 等。在读写 csv 文件时,需要确保指定正确的编码格式,否则可能会出现乱码。例如,在使用 streamreaderstreamwriter 时,可以通过 encoding 参数指定编码:

using (streamreader reader = new streamreader("data.csv", system.text.encoding.utf8))
{
    // 读取操作
}

二、读取 csv 文件的多种方式

(一)使用streamreader逐行读取

原理 :通过 streamreader 逐行读取 csv 文件内容,然后对每一行进行处理,将字符串按逗号分隔成数组。

代码示例

using system;
using system.collections.generic;
using system.io;

class program
{
    static void main()
    {
        list<string[]> csvdata = new list<string[]>();
        using (streamreader reader = new streamreader("data.csv"))
        {
            string line;
            while ((line = reader.readline()) != null)
            {
                // 将每一行按逗号分隔成数组
                string[] fields = line.split(',');
                csvdata.add(fields);
            }
        }
        // 输出读取的数据
        foreach (string[] row in csvdata)
        {
            foreach (string field in row)
            {
                console.write(field + "\t");
            }
            console.writeline();
        }
    }
}

(二)使用textfieldparser(需引用microsoft.visualbasic.dll组件)

  1. 原理textfieldparser 是 .net framework 提供的一个专门用于解析文本文件的类,它可以更好地处理 csv 文件中包含特殊字符的字段。
  2. 代码示例
using system;
using microsoft.visualbasic.fileio;

class program
{
    static void main()
    {
        using (textfieldparser parser = new textfieldparser("data.csv"))
        {
            parser.textfieldtype = fieldtype.delimited;
            parser.setdelimiters(",");
            while (!parser.endofdata)
            {
                try
                {
                    string[] fields = parser.readfields();
                    foreach (string field in fields)
                    {
                        console.write(field + "\t");
                    }
                    console.writeline();
                }
                catch (malformedlineexception ex)
                {
                    console.writeline("行 {0} 格式错误: {1}", parser.linenumber, ex.message);
                }
            }
        }
    }
}
  1. 优点 :能够正确处理字段中包含逗号、引号等特殊字符的情况。
  2. 缺点 :需要引用 microsoft.visualbasic.dll 组件。

(三)使用第三方库(如 csvhelper)

install-package csvhelper
using system;
using system.collections.generic;
using system.io;
using csvhelper;
using csvhelper.configuration;

class program
{
    static void main()
    {
        using (streamreader reader = new streamreader("data.csv"))
        using (csvreader csv = new csvreader(reader, new csvconfiguration(system.globalization.cultureinfo.invariantculture)))
        {
            var records = csv.getrecords<person>().tolist();
            foreach (person person in records)
            {
                console.writeline($"姓名: {person.name}, 年龄: {person.age}, 性别: {person.gender}");
            }
        }
    }
}

public class person
{
    public string name { get; set; }
    public int age { get; set; }
    public string gender { get; set; }
}
  1. 优点 :功能强大,易于使用,支持对象映射和高级配置。
  2. 缺点 :需要引入外部依赖。

三、写入 csv 文件的多种方式

(一)使用streamwriter写入

  1. 原理 :将二维数据数组或列表转换为字符串,按行写入到 csv 文件中。
  2. 代码示例
using system;
using system.io;

class program
{
    static void main()
    {
        string[][] data = new string[][]
        {
            new string[] {"姓名", "年龄", "性别"},
            new string[] {"张三", "25", "男"},
            new string[] {"李四", "30", "女"}
        };
        using (streamwriter writer = new streamwriter("data.csv"))
        {
            foreach (string[] row in data)
            {
                // 将数组元素用逗号连接成一行
                writer.writeline(string.join(",", row));
            }
        }
    }
}

(二)使用stringbuilder构建内容后写入

  1. 原理 :先用 stringbuilder 构建整个 csv 内容,最后一次性写入文件,减少文件操作次数,尤其适用于大量数据写入。
  2. 代码示例
using system;
using system.io;
using system.text;

class program
{
    static void main()
    {
        string[][] data = new string[][]
        {
            new string[] {"姓名", "年龄", "性别"},
            new string[] {"张三", "25", "男"},
            new string[] {"李四", "30", "女"}
        };
        stringbuilder sb = new stringbuilder();
        foreach (string[] row in data)
        {
            sb.appendline(string.join(",", row));
        }
        file.writealltext("data.csv", sb.tostring());
    }
}
  1. 优点 :提高写入效率,适合大量数据写入。
  2. 缺点 :无法自动处理字段中的特殊字符。

(三)使用第三方库(如 csvhelper)写入

  1. 原理 :利用 csvhelper 提供的简便 api,将对象列表写入 csv 文件,自动处理字段中的特殊字符。
  2. 代码示例
using system;
using system.collections.generic;
using system.io;
using csvhelper;

class program
{
    static void main()
    {
        list<person> persons = new list<person>
        {
            new person { name = "张三", age = 25, gender = "男" },
            new person { name = "李四", age = 30, gender = "女" }
        };
        using (streamwriter writer = new streamwriter("data.csv"))
        using (csvwriter csv = new csvwriter(writer, system.globalization.cultureinfo.invariantculture))
        {
            csv.writerecords(persons);
        }
    }
}

public class person
{
    public string name { get; set; }
    public int age { get; set; }
    public string gender { get; set; }
}
  1. 优点 :功能强大,易于使用,自动处理特殊字符。
  2. 缺点 :需要引入外部依赖。

四、csv 数据的解析与处理

(一)处理字段中的特殊字符

  1. 引号包围字段 :如果字段中包含逗号、引号或换行符,需要用双引号将字段包围起来。如果字段本身包含双引号,则需要用两个双引号表示一个双引号。
  2. 代码示例 - 写入包含特殊字符的字段
using system;
using system.io;

class program
{
    static void main()
    {
        string[][] data = new string[][]
        {
            new string[] {"姓名", "年龄", "爱好"},
            new string[] {"张三", "25", "读书, 旅行"},
            new string[] {"李四", "30", "打篮球\" \"排球"}
        };
        using (streamwriter writer = new streamwriter("data.csv"))
        {
            foreach (string[] row in data)
            {
                for (int i = 0; i < row.length; i++)
                {
                    // 如果字段中包含逗号、引号或换行符,用双引号包围
                    if (row[i].contains(",") || row[i].contains("\"") || row[i].contains("\n") || row[i].contains("\r"))
                    {
                        // 将字段中的双引号替换为两个双引号
                        row[i] = "\"" + row[i].replace("\"", "\"\"") + "\"";
                    }
                    writer.write(row[i]);
                    if (i < row.length - 1)
                    {
                        writer.write(",");
                    }
                }
                writer.writeline();
            }
        }
    }
}

(二)将 csv 数据映射到对象

  1. 定义数据类 :根据 csv 文件的结构定义一个对应的类,方便对数据进行操作。
  2. 代码示例
using system;
using system.collections.generic;
using system.io;

class program
{
    static void main()
    {
        list<person> persons = new list<person>();
        using (streamreader reader = new streamreader("data.csv"))
        {
            // 跳过标题行
            reader.readline();
            string line;
            while ((line = reader.readline()) != null)
            {
                string[] fields = line.split(',');
                person person = new person
                {
                    name = fields[0],
                    age = int.parse(fields[1]),
                    gender = fields[2]
                };
                persons.add(person);
            }
        }
        // 输出对象数据
        foreach (person person in persons)
        {
            console.writeline($"姓名: {person.name}, 年龄: {person.age}, 性别: {person.gender}");
        }
    }
}

public class person
{
    public string name { get; set; }
    public int age { get; set; }
    public string gender { get; set; }
}

五、注意事项

文件路径问题    

if (!file.exists("data.csv"))
{
    console.writeline("文件不存在!");
}

数据类型转换问题 

int age;
if (int.tryparse(fields[1], out age))
{
    person.age = age;
}
else
{
    console.writeline("年龄数据格式错误!");
}

性能优化

以上就是c#操作csv文件的详细教程的详细内容,更多关于c#操作csv文件的资料请关注代码网其它相关文章!

(0)

您想发表意见!!点此发布评论

推荐阅读

使用C#设置Word文档段落缩进的多种方式

01-23

C#的const和static的定义和核心区别

01-25

C#实现将Excel表格转换为DataTable

01-21

C#数组去重的方法汇总

01-21

C#实现Word文档的精准插入与段落格式化

01-26

使用C#高效嵌入文件和注释附件到PDF文档的操作指南

01-20

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论