You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中检测CSV文件空行并向空行写入数据

在C#中检测CSV空行并写入数据

一、检测CSV中的完全空白行

你的现有代码使用TextFieldParser解析CSV,但默认的ReadFields()对完全空白行返回null,更严谨的方式是先读取原始行,判断是否为纯空白(包含空格、制表符等)。修改后的读取逻辑如下:

static public void ModuleSalarie()
{
    string fileName = "Salarie.csv";
    string path = Path.Combine(Environment.CurrentDirectory, @"Data\", fileName);
    using (var reader = new StreamReader(path))
    {
        using (TextFieldParser parser = new TextFieldParser(reader))
        {
            parser.TextFieldType = FieldType.Delimited;
            parser.SetDelimiters(",");
            int lineNumber = 0;

            while (!parser.EndOfData)
            {
                lineNumber++;
                // 读取原始行判断是否为空白行
                string rawLine = reader.ReadLine();
                // 同步TextFieldParser的流位置,避免解析错位
                parser.ReadLine();

                if (string.IsNullOrWhiteSpace(rawLine))
                {
                    Console.WriteLine($"第{lineNumber}行是完全空白行");
                    continue;
                }

                // 解析非空行字段
                string[] ligne = parser.ReadFields();
                foreach (string colonne in ligne)
                {
                    Console.WriteLine(colonne);
                }
                Console.WriteLine();
            }
        }
    }
}

关键说明:

  • string.IsNullOrWhiteSpace(rawLine)可覆盖全空格、制表符等空白场景
  • 同步TextFieldParser的流位置,防止因StreamReader.ReadLine()移动指针导致解析错误

二、向空行写入数据的方法

向CSV空行写入数据,通常需要先读取所有行、定位空行修改后再写回文件,以下是两种常用实现:

方法1:替换所有空白行内容

static public void WriteToAllEmptyCsvLines(string csvContent)
{
    string fileName = "Salarie.csv";
    string path = Path.Combine(Environment.CurrentDirectory, @"Data\", fileName);
    // 读取所有行到内存
    string[] allLines = File.ReadAllLines(path);

    for (int i = 0; i < allLines.Length; i++)
    {
        if (string.IsNullOrWhiteSpace(allLines[i]))
        {
            // 替换空行为符合CSV格式的内容(多字段用逗号分隔)
            allLines[i] = csvContent;
        }
    }

    // 将修改后的内容写回文件
    File.WriteAllLines(path, allLines);
}

方法2:仅写入第一个空白行

如果只需要填充第一个空行,可修改循环逻辑:

static public void WriteToFirstEmptyCsvLine(string csvContent)
{
    string fileName = "Salarie.csv";
    string path = Path.Combine(Environment.CurrentDirectory, @"Data\", fileName);
    string[] allLines = File.ReadAllLines(path);
    bool isWrote = false;

    for (int i = 0; i < allLines.Length; i++)
    {
        if (string.IsNullOrWhiteSpace(allLines[i]))
        {
            allLines[i] = csvContent;
            isWrote = true;
            break; // 找到第一个空行后停止
        }
    }

    if (isWrote)
    {
        File.WriteAllLines(path, allLines);
        Console.WriteLine("已在第一个空行写入数据");
    }
    else
    {
        Console.WriteLine("未找到空白行,已追加内容到文件末尾");
        File.AppendAllText(path, Environment.NewLine + csvContent);
    }
}

注意事项:

  • 写入内容需符合CSV格式,多字段用逗号分隔,例如"张三,30,技术部"
  • 若CSV文件过大,File.ReadAllLines()会占用较多内存,建议逐行读取写入临时文件,最后替换原文件

三、整合检测与写入逻辑

可以在读取时记录空行位置,再针对性写入数据:

static public void ProcessCsvEmptyLines()
{
    string fileName = "Salarie.csv";
    string path = Path.Combine(Environment.CurrentDirectory, @"Data\", fileName);
    List<string> lines = new List<string>();
    List<int> emptyLineIndexes = new List<int>();

    // 读取文件并记录空行位置
    using (StreamReader reader = new StreamReader(path))
    {
        string line;
        int index = 0;
        while ((line = reader.ReadLine()) != null)
        {
            lines.Add(line);
            if (string.IsNullOrWhiteSpace(line))
            {
                emptyLineIndexes.Add(index);
            }
            index++;
        }
    }

    // 给每个空行写入默认员工数据
    foreach (int idx in emptyLineIndexes)
    {
        lines[idx] = "默认员工,25,行政部";
    }

    // 写回文件
    File.WriteAllLines(path, lines);
    Console.WriteLine($"已处理{emptyLineIndexes.Count}个空白行");
}

内容的提问来源于stack exchange,提问作者Roumilhac Clément

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:43:35