如何在C#中按分组拆分竖线分隔文件
按竖线分隔字段拆分文件到对应命名的独立文件(LINQ实现)
问题场景
现有一个竖线分隔的文本文件,每行第二个字段为目标文件名,需要将原文件按该字段分组,把每组内容写入对应名称的独立文件。
示例输入文件内容
A|File1 B|File1 C|File1 D|File2 E|File2 F|File2 G|File3 H|File3 I|File3
期望输出
- 生成
File1.txt,内容为:
A|File1 B|File1 C|File1
- 生成
File2.txt,内容为:
D|File2 E|File2 F|File2
- 生成
File3.txt,内容为:
G|File3 H|File3 I|File3
解决方案代码
以下是使用C# LINQ实现的完整代码,核心是通过LINQ分组获取唯一文件名并批量写入文件:
using System; using System.IO; using System.Linq; namespace FileSplitter { class SplitWithGroups { static void Main() { // 读取原文件所有行 string[] myfile = File.ReadAllLines(@"D:\FileSplitter\TestFile.txt"); // LINQ分组查询:按每行拆分后的第二个字段(目标文件名)分组 var groupQuery = from line in myfile let targetFileName = line.Split('|')[1] group line by targetFileName into groupedLines select groupedLines; // 遍历每个分组,写入对应文件 foreach (var group in groupQuery) { // 构造输出文件路径 string outputFilePath = @"D:\FileSplitter\" + group.Key + ".txt"; // 控制台输出当前处理的文件名(可选) Console.WriteLine("正在写入文件:{0}", group.Key); // 使用StreamWriter写入文件,using块自动释放资源 using (StreamWriter sw = new StreamWriter(outputFilePath)) { foreach (var line in group) { sw.WriteLine(line); // 控制台输出当前写入的行(可选) Console.WriteLine(" 写入行:{0}", line); } } } // 保持控制台窗口打开(调试用) Console.WriteLine("文件拆分完成,按任意键退出"); Console.ReadKey(); } } }
关键代码解释
- 分组查询
groupQuery:- 遍历原文件的每一行
line - 使用
let关键字定义临时变量targetFileName,通过line.Split('|')[1]提取每行的第二个字段(目标文件名) - 使用
group line by targetFileName into groupedLines将所有行按目标文件名分组,每个分组的Key就是目标文件名,分组内包含所有对应行
- 遍历原文件的每一行
内容的提问来源于stack exchange,提问作者Zach Lau
相关产品推荐
相关产品推荐

