C#读取处理CSV后无法逐行写入,输出格式不符预期求助
CSV处理后无法逐行写入新文件
我正在逐行读取CSV文件(更新并追加部分值)并转换为列表,但写入新CSV时无法实现逐行写入。
实际输出格式:
1 abc 76-8 3 sht 09-9 5 bry 77-0
预期输出格式:
1 abc 76-8 3 sht 09-9 5 bry 77-0
我的代码如下:
using (var reader = new StreamReader(@"D:FileWatcher/File_A.csv")) { List<string> fulllist = File.ReadAllLines(@"D:FileWatcher/File_A.csv").ToList(); foreach(var item in fulllist) { var line = reader.ReadLine(); var values = line.Split(',').ToList(); var Col1Value = values[0].Substring(8,2); var Col0Value = values[0].Substring(0,7); values.RemoveAt(0); values.Insert(0, Col1Value); values.Insert(0, Col0Value); string combinedString = string.Join(",", values); var PathforFileB = @"D:FileWatcher/Result/File_B.csv"; File.WriteAllText(PathforFileB, combinedString); } }
问题根源
File.WriteAllText每次执行都会覆盖整个文件,最后只保留最后一次循环生成的内容;- 代码同时用
StreamReader和File.ReadAllLines读取同一个文件,属于重复操作,完全没必要; - 处理后的字符串没有添加换行符,导致所有内容挤在一行。
修复方案
方案一:逐行追加写入(简单直接)
先清空目标文件,再用File.AppendAllText把每一行处理后的内容追加到文件末尾,同时加上换行符:
var inputPath = @"D:FileWatcher/File_A.csv"; var outputPath = @"D:FileWatcher/Result/File_B.csv"; // 先清空目标文件(如果不需要保留历史内容) File.WriteAllText(outputPath, string.Empty); foreach (var line in File.ReadAllLines(inputPath)) { var values = line.Split(',').ToList(); var Col1Value = values[0].Substring(8, 2); var Col0Value = values[0].Substring(0, 7); values.RemoveAt(0); values.Insert(0, Col1Value); values.Insert(0, Col0Value); string combinedString = string.Join(",", values); // 添加换行符后追加到文件 File.AppendAllText(outputPath, combinedString + Environment.NewLine); }
方案二:批量写入(更高效)
先把所有处理后的行收集到列表里,最后一次性写入文件,减少IO操作次数:
var inputPath = @"D:FileWatcher/File_A.csv"; var outputPath = @"D:FileWatcher/Result/File_B.csv"; var processedLines = new List<string>(); foreach (var line in File.ReadAllLines(inputPath)) { var values = line.Split(',').ToList(); var Col1Value = values[0].Substring(8, 2); var Col0Value = values[0].Substring(0, 7); values.RemoveAt(0); values.Insert(0, Col1Value); values.Insert(0, Col0Value); processedLines.Add(string.Join(",", values)); } // 一次性写入所有行,自动添加换行符 File.WriteAllLines(outputPath, processedLines);
额外优化说明
- 移除了多余的
StreamReader,直接用File.ReadAllLines遍历即可; - 方案二更适合处理大文件,因为减少了频繁的文件读写操作;
- 使用
Environment.NewLine替代硬编码的\n,保证在不同操作系统下换行符都能正常工作。
内容的提问来源于stack exchange,提问作者shreyas
相关产品推荐
相关产品推荐

