You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell合并多CSV文件后输出文件开头存在异常字符导致系统拒收的问题咨询

解决PowerShell合并CSV后输出文件出现奇怪字符的问题

这个问题我之前也碰到过,大概率是**UTF-8 BOM(字节顺序标记)**在搞鬼,再加上你用文本方式处理CSV的一些潜在问题,我给你拆解下解决思路:

1. 奇怪字符的根源:UTF-8 BOM

你用的Out-File -Encoding utf8在PowerShell 5.1里默认会给文件加上UTF-8 BOM(开头的这类奇怪字符就是它),很多目标系统(比如部分Linux工具、旧版数据库、某些业务系统)不识别BOM,就会把它当成无效字符。

解决BOM问题的两种方式:

如果你用的是PowerShell 7+(推荐)

直接用-Encoding utf8NoBOM替代utf8,它会生成无BOM的UTF-8文件:

Get-ChildItem C:\ATR\*.csv | foreach { Get-Content $_ } | sort -Unique | Out-File C:\ATR\fileX.csv -Encoding utf8NoBOM

如果你还在使用PowerShell 5.1

5.1没有utf8NoBOM参数,得用.NET的文件写入方法来绕开:

$mergedContent = Get-ChildItem C:\ATR\*.csv | foreach { Get-Content $_ } | sort -Unique
[System.IO.File]::WriteAllLines("C:\ATR\fileX.csv", $mergedContent, [System.Text.Encoding]::UTF8)

2. 更可靠的CSV合并方式:用结构化命令替代文本处理

你当前用Get-Content把CSV当纯文本处理,虽然能合并,但有两个隐患:

  • 每个CSV的表头会重复,即便用Sort-Unique去重,万一表头有细微差异(比如空格、大小写)就会出问题;
  • Get-Content默认用系统ANSI编码读取,若你的源CSV是UTF-8编码,可能会读乱内容。

推荐用Import-Csv和Export-Csv来处理,它们会识别CSV的结构,自动处理表头:

# 导入所有CSV,合并后去重,导出无BOM的UTF-8文件(PowerShell 7+)
Get-ChildItem C:\ATR\*.csv | Import-Csv | Sort-Object * -Unique | Export-Csv C:\ATR\fileX.csv -NoTypeInformation -Encoding utf8NoBOM

如果是PowerShell 5.1,同样用.NET方法导出:

$mergedCsv = Get-ChildItem C:\ATR\*.csv | Import-Csv | Sort-Object * -Unique
$csvContent = $mergedCsv | ConvertTo-Csv -NoTypeInformation
[System.IO.File]::WriteAllLines("C:\ATR\fileX.csv", $csvContent, [System.Text.Encoding]::UTF8)

3. 额外检查点

  • 确认源CSV文件的编码:如果源文件是GBK/ANSI编码,用Get-Content时要指定-Encoding Default(对应系统ANSI)或-Encoding GB2312,避免读取乱码;
  • 若不需要去重,去掉Sort-Unique/Sort-Object * -Unique,提升合并速度。

内容的提问来源于stack exchange,提问作者user2414682

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 14:12:29