使用StreamWriter导出CSV时保留含逗号单元格及转用Export-Csv的方法
解决方法
一、重构StreamWriter代码(手动处理CSV格式)
核心是严格遵循CSV规范:包含逗号、双引号或换行的字段必须用双引号包裹,字段内的双引号需要转义为两个双引号。按以下逻辑修改代码:
- 读取TXT文件的所有行,按每10行分组。
- 对每组内的每一行内容做格式处理:
- 把内容里的双引号替换为两个双引号(CSV转义规则)。
- 用双引号包裹处理后的内容。
- 将每组内的10个格式化字段用逗号拼接成一行,写入CSV文件。
示例C#代码:
using System.IO; using System.Linq; var txtLines = File.ReadAllLines("input.txt"); using var sw = new StreamWriter("output.csv"); // 按每10行分组 var lineGroups = txtLines.Select((line, index) => new { Line = line, GroupIndex = index / 10 }) .GroupBy(item => item.GroupIndex); foreach (var group in lineGroups) { var formattedFields = group.Select(item => { var escapedLine = item.Line.Replace("\"", "\"\""); return $"\"{escapedLine}\""; }); sw.WriteLine(string.Join(",", formattedFields)); }
二、改用PowerShell的Export-Csv实现
Export-Csv会自动处理CSV格式规范(比如给含特殊字符的字段自动加双引号),无需手动处理转义。核心是把每10行TXT内容封装为自定义对象,再导出为CSV:
- 读取TXT文件的所有行。
- 按每10行分组,为每组创建一个自定义对象,对象的10个属性对应这10行内容(不足10行的补空值)。
- 将对象集合通过Export-Csv导出,指定不输出类型信息。
示例PowerShell代码:
$txtLines = Get-Content "input.txt" $csvItems = @() # 按每10行分组循环 for ($i = 0; $i -lt $txtLines.Count; $i += 10) { $currentGroup = $txtLines[$i..($i+9)] # 动态生成包含10个字段的自定义对象 $props = @{} for ($j = 0; $j -lt 10; $j++) { $fieldName = "Field$($j+1)" $props[$fieldName] = if ($j -lt $currentGroup.Count) { $currentGroup[$j] } else { "" } } $csvItems += [PSCustomObject]$props } # 导出CSV,自动处理特殊字符 $csvItems | Export-Csv -Path "output.csv" -NoTypeInformation -Encoding UTF8
内容的提问来源于stack exchange,提问作者Tommy K
相关产品推荐
相关产品推荐

