PowerShell处理CP850编码CSV导出空文件/成员已存在报错排查
问题原因
- 编码参数错误:PowerShell 5.1自带的
-Encoding OEM参数会读取当前系统默认OEM代码页,不会固定使用CP850(DOS Latin1)。如果系统区域不是德语,解码带äöü变音的德文字符时会直接乱码,甚至错误吞掉字段分隔符,把普通字段值解析成重复的列属性名,触发「元素"Här"已存在」的报错。 - 源文件损坏风险:你写的第一条命令直接在原文件上执行跳过前2行的操作,
Get-Content默认用错误编码读取内容,写回原文件时已经把编码改乱,后续步骤读取时只能识别到表头行,识别不到数据行,最终导出文件只有列名。 - 冗余步骤问题:拆分3条命令生成中间临时文件的逻辑,每一步都可能因为编码不一致引入新错误,没有必要。
可直接运行的解决方案
不需要提前手动转码,不需要修改原始import.csv文件,不需要生成中间临时文件,直接把以下内容写进bat批处理文件即可,全版本Windows PowerShell兼容,不受系统区域设置影响:
@echo off powershell -ExecutionPolicy Bypass -Command "$cp850 = [System.Text.Encoding]::GetEncoding(850); $allLines = [System.IO.File]::ReadAllLines((Resolve-Path '.\import.csv').Path, $cp850); $allLines | Select-Object -Skip 2 | ConvertFrom-Csv -Delimiter ';' | Select-Object Inv, N_No | Export-Csv '.\export.csv' -Delimiter ';' -Encoding UTF8 -NoTypeInformation"
命令逻辑说明
- 直接调用.NET底层文件读取接口,强制指定CP850编码读取源文件,变音字符不会乱码,完全绕过PowerShell内置Encoding参数的区域适配问题
- 直接在内存中跳过前2行非表头内容,不会修改原始import.csv文件
- 直接筛选
Inv和N_No两列导出为UTF8编码的最终CSV文件,无中间文件冗余步骤 - 导出的文件可以直接被LibreOffice、Excel等工具正常打开,后续脚本处理也不会出现编码问题
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

