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
相关产品推荐
相关产品推荐

