C#—csv文件格式操作

C#---csv文件格式操作

目录

C#---csv文件格式操作

介绍

核心特点

结构化数据

C#操作csv示例:

写入CSV文件

读取CSV文件

[CSV 的优缺点](#CSV 的优缺点)

常见使用场景

编码问题

winform操作csv文件格式实例


介绍

CSV(Comma-Separated Values,逗号分隔值)是一种简单且通用的文本文件格式,用于存储和交换表格数据(如电子表格或数据库内容)。它被广泛用于数据导入/导出、跨平台数据共享以及轻量级数据存储场景。

核心特点

纯文本格式以 .csv 为扩展名,文件内容为纯文本,无需专用软件即可查看和编辑(如记事本、VS Code)。

结构化数据

  • 每行表示一条记录(Record)。
  • 每个记录由字段(Field)组成,字段间用分隔符(逗号 ,\n换行)分隔。
  • 首行可选为表头(Header),描述字段名称。
  • 格式示列:
  • 使用记事本打开csv文件展示
cs 复制代码
ID,Name,Age,Email
1,John Doe,30,[email protected]
2,"Jane Smith, Jr.",25,[email protected]
3,"Bob ""The Builder""",28,[email protected]
  • 使用wpf office打开csv文件展示

C#操作csv示例:

写入CSV文件
cs 复制代码
static void Main()
    {
        string filePath = "example.csv";
        using (StreamWriter sw = new StreamWriter(filePath, Encoding.UTF8))
        {
            sw.WriteLine("Name,Age,City \n"); // 写入表头
            sw.WriteLine("Alice,30,New York \n"); // 写入数据行
            sw.WriteLine("Bob,25,Los Angeles \n");
        }
    }
读取CSV文件
cs 复制代码
static void Main()
    {
        string filePath = "example.csv";
        using (StreamReader sr = new StreamReader(filePath, Encoding.UTF8))
        {
            while (!sr.EndOfStream)
            {
                string line = sr.ReadLine();
                string[] values = line.Split('\n'); // 使用\n换行字符分割每行数据
                Console.WriteLine($"Name: {values[0]}, Age: {values[1]}, City: {values[2]}");
            }
        }
    }
复制代码

CSV 的优缺点

|------------------------|---------------------|
| 优点 | 缺点 |
| 简单易读,兼容所有文本编辑器 | 无数据类型定义(全为字符串) |
| 跨平台(Excel、数据库、编程语言均支持) | 无标准化规范(分隔符、编码可能不一致) |
| 适合大数据量快速导入导出 | 不支持复杂结构(如嵌套数据) |
| 无二进制内容,体积小 | 缺乏格式控制(如字体、颜色) |

常见使用场景

  1. 数据导入/导出
  2. 将数据库表导出为 CSV,供其他系统使用。
  3. 从 Excel 导出数据到第三方工具(如 Python、R)。
  4. 数据交换
  5. 在不同软件(如 Salesforce、邮件营销工具)间传递客户列表。
  6. 日志记录
  7. 存储结构化日志(如时间戳、事件类型、描述)。
  8. 机器学习
  9. 存储训练数据集(如鸢尾花数据集)。

编码问题

推荐使用 UTF-8 编码保存 CSV 文件,避免中文乱码。

cs 复制代码
 StreamReader sr = new StreamReader(fileName, Encoding.UTF8);
 string s = sr.ReadToEnd(); // 读取数据

winform操作csv文件格式实例

效果

当点击写入按钮时则向csv文件中写入一条数据,当点击读取时则读取出所有数据。

一、在winform界面中拖入2个按钮

二、封装csv操作类

cs 复制代码
public class CSVAPI
{
    public void SaveData(string data,string result)
    {
        string path = Directory.GetCurrentDirectory() + "\\data";
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }
        string fileName = $"{path}\\{DateTime.Now.ToString("yyyy-MM-dd")}.csv"; // 文件路径
        if (!File.Exists(fileName)) // 如果csv文件不存在
        {
            // FileStream 文件流
            // 参数1 文件操作路径
            // 参数2 FileMode Create 如果有则替换,如果没有 则新建
            // 参数3 FileAccess.Write 写入的权限
            FileStream fs = new FileStream(fileName,FileMode.Create,FileAccess.Write);

            // StreamWriter 写入工具
            StreamWriter sw = new StreamWriter(fs,Encoding.Default);
            StringBuilder sb = new StringBuilder(); // 定义可变字符串,保存存储的数据
            sb.Append("时间").Append(",").Append("姓名").Append(",").Append("事件");
            sw.WriteLine(sb);
            sw.Close();
            sw.Dispose();
            fs.Close();
            fs.Dispose();
        }
        using (StreamWriter sw2 = new StreamWriter(fileName, true,Encoding.Default))
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(DateTime.Now.ToString("HH-mm-ss")).Append(",").Append(data).Append(",").Append(result+"\n");
            sw2.Write(sb.ToString());
        }
    }

    /// <summary>
    /// 读取CSV
    /// </summary>
    /// <returns></returns>
    public string ReadData()
    {
        string path = Directory.GetCurrentDirectory() + "\\data";
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }
        string fileName = $"{path}\\{DateTime.Now.ToString("yyyy-MM-dd")}.csv"; // 文件路径
        if (!File.Exists(fileName))
        {
            return "文件不存在";
        }

        StreamReader sr = new StreamReader(fileName,Encoding.Default);
        string s = sr.ReadToEnd(); // 读取数据
        sr.Close();
        sr.Dispose();
        return s;
    }
}

三、实现按钮事件

cs 复制代码
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    CSVAPI api = new CSVAPI();

    /// <summary>
    /// 写入
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button1_Click(object sender, EventArgs e)
    {
        api.SaveData("吴亦凡","蹲完中国蹲加拿大");
    }

    /// <summary>
    /// 读取
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button2_Click(object sender, EventArgs e)
    {
        string s = api.ReadData();
        MessageBox.Show(s);
    }
}

使用wpf office打开csv文件展示的效果

相关推荐
YiSLWLL6 分钟前
Tauri 2.3.1+Leptos 0.7.8开发桌面应用--Sqlite数据库的写入、展示和选择删除
数据库·vscode·rust·sqlite·sqlx
KENYCHEN奉孝15 分钟前
一个基于Django的写字楼管理系统实现方案
数据库·python·django·sqlite
斯普信专业组24 分钟前
磐维数据库在BClinux-8.4系统上的部署指南
数据库
Elastic 中国社区官方博客31 分钟前
Elasticsearch 8.18 中提供了原生连接 (Native Joins)
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
island131433 分钟前
《突破控件限制:用Qt绘图API解锁高级界面定制能力》
java·数据库·qt
唐青枫38 分钟前
C# 如何比较两个List是否相等?
c#·.net
APItesterCris39 分钟前
Python + 淘宝 API 开发实战:自动化采集商品详情与 SKU 数据清洗指南
大数据·运维·数据库·自动化
w23617346012 小时前
深入解析布尔注入:原理、实战与防御
数据库·网络安全·sql注入·布尔注入·数据库注入
Elastic 中国社区官方博客5 小时前
如何在不同版本的 Elasticsearch 之间以及集群之间迁移数据
大数据·数据库·elasticsearch·搜索引擎·全文检索·logstash
搬砖工程师Cola6 小时前
<C#>在 C# .NET 6 中,使用IWebHostEnvironment获取Web应用程序的运行信息。
开发语言·c#·.net