求助:如何用C#移除TXT文件引号外及末尾多余空格?
带引号CSV文件空格清理+传输实现方案
你的需求是处理带引号的逗号分隔文件,移除引号外的所有空格和最后一列后的冗余空格,再完成文件传输。以下是具体实现步骤:
一、核心空格清理逻辑
针对带引号的CSV格式,关键是区分引号内外的内容,只清理引号外的空格:
- 逐行处理文件内容,用一个标记跟踪当前是否处于引号内部
- 遍历每个字符:
- 遇到双引号时,切换引号内/外的状态,同时保留引号
- 处于引号内时,所有字符(包括空格)都保留
- 处于引号外时,跳过所有空格,只保留逗号和有效数据字符
- 每行处理完后,再去掉行尾的所有空格,解决最后一列后的冗余问题
对应的C#方法实现:
private string CleanCsvLine(string line) { var cleanedLine = new StringBuilder(); bool inQuotes = false; foreach (char c in line) { if (c == '"') { inQuotes = !inQuotes; cleanedLine.Append(c); } else if (inQuotes) { cleanedLine.Append(c); } else { // 引号外的空格直接忽略,其他字符保留 if (c != ' ') { cleanedLine.Append(c); } } } // 清除行尾所有多余空格 return cleanedLine.ToString().TrimEnd(); }
二、结合文件传输的完整流程
你当前用WinSCP的GetFiles从源位置拉取文件,调整流程为「拉取临时文件→清理内容→写入最终目标路径」,完整代码如下:
// 1. 先将源文件下载到本地临时路径 string tempFilePath = Path.Combine(Path.GetTempPath(), $"temp_{FileNameDestination}"); TransferOptions transferOptions = new TransferOptions(); transferOptions.TransferMode = TransferMode.Binary; TransferOperationResult transferResult = session.GetFiles( $"{FileSource}{FileNameSource}", tempFilePath, false, transferOptions); transferResult.Check(); // 捕获传输错误 // 2. 处理大文件推荐用流操作,避免内存溢出 using (var reader = new StreamReader(tempFilePath)) using (var writer = new StreamWriter($"{FileDestination}{FileNameDestination}")) { string line; while ((line = reader.ReadLine()) != null) { writer.WriteLine(CleanCsvLine(line)); } } // 3. 清理临时文件(可选) File.Delete(tempFilePath);
三、额外注意点
- 如果你的CSV用单引号作为分隔符,把代码中判断引号的
'"'改成'\''即可 - 若源文件是本地文件,直接跳过WinSCP传输步骤,读取本地文件路径处理即可
- 测试时优先用小样本文件验证,确保引号内的空格被保留、引号外的空格被正确清除
内容的提问来源于stack exchange,提问作者Antônio Magalhaes
相关产品推荐
相关产品推荐

