如何通过SSIS脚本向百万行平面文件每行末尾追加文本?
解决方案:给百万行文本文件每行追加字符串
你的原代码不可行,核心问题有两个:
File.ReadAllLines会直接把文件按行拆分,返回的每个item就是单独的一行内容,不包含换行符\n,所以你用Replace("\n")根本找不到要替换的内容,这就是识别不了换行符的原因。- 代码里没有实现写入文件的逻辑,而且额外的拆分操作完全是多余的,还会降低处理效率。
针对百万行的大文件,推荐两种处理方式:
方式一:内存充足时的简化写法
如果文件每行内容不长,内存能一次性容纳所有行数据,可以用这种简洁的写法:
public void Main() { string filePath = @"E:\SSISSource\Source\Source.txt"; // 读取所有行,给每行末尾追加目标字符串 var modifiedLines = System.IO.File.ReadAllLines(filePath) .Select(line => line + "~20221214"); // 一次性写入覆盖原文件 System.IO.File.WriteAllLines(filePath, modifiedLines); Dts.TaskResult = (int)ScriptResults.Success; }
方式二:超大文件的高效逐行处理
如果文件体积过大(比如每行内容很长,百万行占内存超过数GB),用逐行读写的方式可以大幅降低内存占用,避免内存溢出:
public void Main() { string sourcePath = @"E:\SSISSource\Source\Source.txt"; string tempPath = @"E:\SSISSource\Source\Source_Temp.txt"; // 用Stream逐行读取、处理、写入临时文件 using (var reader = new System.IO.StreamReader(sourcePath)) using (var writer = new System.IO.StreamWriter(tempPath)) { string line; while ((line = reader.ReadLine()) != null) { writer.WriteLine(line + "~20221214"); } } // 替换原文件:先删原文件,再把临时文件重命名为原文件名 System.IO.File.Delete(sourcePath); System.IO.File.Move(tempPath, sourcePath); Dts.TaskResult = (int)ScriptResults.Success; }
这种方式每次只在内存中保留一行数据,内存占用几乎可以忽略,适合处理超大文件。注意临时文件要和原文件放在有足够剩余空间的位置,处理完成后再替换原文件。
内容的提问来源于stack exchange,提问作者James Budd
相关产品推荐
相关产品推荐

