C#如何按指定前缀提取CSV行并批量写入新CSV文件
C# 多CSV文件筛选合并实现方案
问题根因
你的代码无法正常写入多文件内容的核心原因如下:
File.WriteAllText方法每次调用都会清空目标文件的原有内容,仅保留当前写入的内容,因此最终只能留存最后一次调用时写入的单行数据- 缺少表头单独处理逻辑,会出现表头丢失或多文件表头重复写入的问题
- 输出文件存放在源CSV目录下,未做排除会导致生成后被重复读取,产生脏数据
修复后完整代码
static void Main(string[] args) { try { string sourceDirectory = @"C:\temp\csvfiles\"; string outputPath = @"C:\temp\csvfiles\testdone.csv"; string filterKeyword = "BAK"; // 可替换为你需要筛选的前缀 bool isHeaderWritten = false; // 枚举所有CSV文件,排除自身生成的输出文件 var csvFiles = Directory.EnumerateFiles(sourceDirectory, "*.csv", SearchOption.AllDirectories) .Where(f => !f.Equals(outputPath, StringComparison.OrdinalIgnoreCase)); foreach (string currentFile in csvFiles) { var allLines = File.ReadAllLines(currentFile).ToList(); if (allLines.Count == 0) continue; // 表头仅写入一次 if (!isHeaderWritten) { File.WriteAllText(outputPath, allLines[0] + Environment.NewLine); isHeaderWritten = true; } // 筛选符合条件的行,跳过表头行 var matchedLines = allLines.Skip(1) .Where(line => line.Contains(filterKeyword)) // 任意位置包含关键词,如需限定列可调整为Split后的判断 .ToList(); // 批量追加匹配的行到输出文件 if (matchedLines.Count > 0) { File.AppendAllLines(outputPath, matchedLines); } } } catch (Exception ex) { Console.WriteLine($"处理出错:{ex.Message}"); } }
逻辑说明
- 筛选规则:默认判断整行任意位置包含指定关键词,如果你需要限定仅在某一列匹配,可以将
line.Contains(filterKeyword)替换为你原有的line.Split(';').Last().Contains("GFP")类的逻辑 - 写入优化:采用批量追加的方式写入,相比逐行写入性能更高,也不会出现内容覆盖的问题
- 异常处理:增加了通用异常捕获,方便定位文件读取、写入权限类的问题
内容的提问来源于stack exchange,提问作者justthebrave
相关产品推荐
相关产品推荐

