如何在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
相关产品推荐
相关产品推荐

