PowerShell导出CSV后Excel丢失前导零的问题求助
保留CSV导出值的前导零(Excel打开时不丢失)
我需要用Get-ChildItem(简称gci)提取名为'2023'的文件夹下所有文件名中第一个.后的带前导零数值(比如文件名12345.001.chris_comp.NY.2023_08_22.xlsx中的001),导出到CSV后,在Notepad++中查看正常,但Excel打开会自动去除前导零,显示为1。
当前使用的代码:
#splitFile $numberedFolder = 'C:\Users\cthor\OneDrive\Documents\PowerShell\Test' $outputFile = "C:\Users\cthor\OneDrive\Documents\PowerShell\Results\results_$(Get-Date -f yyyy-MM-dd-hh-mm-ss).csv" Get-ChildItem -Directory -Recurse -LiteralPath $numberedFolder -Filter '2023' | Get-ChildItem -File | Select-Object @{name='process id';Expression={'{0:d3}' -f [int] $_.Name.Split('.')[1]}} | #preverse leading 0's. Export-Csv -Path $outputFIle -Append -NoTypeInformation
临时解决方法:试过在格式化字符串前加制表符,测试有效,但希望找到更优方案:
# 将 '{0:d3}' 替换为 "`t{0:d3}"
最优解决方案
问题根源有两个:
- 代码中先将原始带前导零的字符串转为
[int],转换过程直接丢失了前导零,后续格式化只是补零而非保留原始值; - Excel会自动识别CSV中的数字内容,即使是
001也会被转为数字类型,从而去除前导零。
修改后的代码(直接保留原始字符串,并标记为Excel可识别的文本格式):
#splitFile $numberedFolder = 'C:\Users\cthor\OneDrive\Documents\PowerShell\Test' $outputFile = "C:\Users\cthor\OneDrive\Documents\PowerShell\Results\results_$(Get-Date -f yyyy-MM-dd-hh-mm-ss).csv" Get-ChildItem -Directory -Recurse -LiteralPath $numberedFolder -Filter '2023' | Get-ChildItem -File | Select-Object @{ name='process id'; Expression={ # 直接提取原始带前导零的分段字符串,避免转int丢失信息 $rawSegment = $_.Name.Split('.')[1] # 加单引号让Excel识别为文本,单引号不会在Excel中显示 "'$rawSegment" } } | Export-Csv -Path $outputFile -Append -NoTypeInformation -UseQuotes AsNeeded
另一种可选方案(用=包裹双引号的形式):
# 修改Expression部分为: Expression={ $rawSegment = $_.Name.Split('.')[1] "=`"$rawSegment`"" }
说明
- 直接提取文件名分割后的原始字符串,避免类型转换丢失前导零;
- 通过添加文本标记(单引号或
=+双引号),强制Excel将该单元格识别为文本类型,从而保留前导零; -UseQuotes AsNeeded参数让CSV仅在必要时添加引号,保证文件简洁性。
内容的提问来源于stack exchange,提问作者cthorn112
相关产品推荐
相关产品推荐

