PowerShell读取CSV并仅保留真实列数的通用实现方案问询
问题场景与需求
从下属站点获取的CSV数据存在右侧大量多余逗号的问题,已通过$realcols = $file[0].psobject.properties.name.count获取到真实列数,需要编写通用PowerShell脚本,读取CSV后仅保留前对应真实列数的列,无需指定列名,以适配多种CSV文件。
现有代码片段:
$file = Import-csv $fileName $columnNames = @($file[0].psobject.properties.Name) $columnCount = $columnNames.Count $file[0] $columnCount
示例CSV(右侧含大量多余逗号):
CustomerCode,Customer,ISO Country,SIC,EC or IC,Email SalesPerson,Customer Segment (A/B/C/D/E/Z),New Application,,Previous Application,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 6,C INVEST LLC,UA,32,14,serhii.xx@xx.com,?,C/T&E,L,Tiles,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 23,INTER JSC,UA,32,3,Oleksandr.zz@xx.com,Z,C/T,O,Ziles,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
期望实现类似如下伪代码的效果:
# $new = $file | Select-Object [0,$columncount] # $new[0]
可行实现方案
核心思路是提取前$columnCount个真实列名,通过Select-Object筛选这些列即可,具体代码如下:
$fileName = "你的CSV文件路径" # 读取原始CSV文件 $file = Import-Csv $fileName # 获取第一行的所有真实列名数组 $columnNames = @($file[0].psobject.properties.Name) $columnCount = $columnNames.Count # 筛选前$columnCount个列,自动丢弃多余空列 $cleanedCsv = $file | Select-Object $columnNames[0..($columnCount-1)] # 输出第一条数据验证清理效果 $cleanedCsv[0] # 可选:将清理后的数据导出为新CSV $cleanedCsv | Export-Csv -Path "清理后的CSV文件路径.csv" -NoTypeInformation -Encoding UTF8
代码说明
$columnNames[0..($columnCount-1)]:截取真实列名数组的前$columnCount个元素(数组索引从0开始,因此结束索引为$columnCount-1)Select-Object接收列名数组作为参数,会精准保留指定列,自动忽略所有由右侧多余逗号生成的空列- 导出CSV时,
-NoTypeInformation用于避免PowerShell自动添加类型信息行,-Encoding UTF8保证文件编码的兼容性
方案通用性说明
- 无需手动指定任何列名,完全依赖CSV第一行的真实列数自动适配不同结构的CSV文件
- 无论右侧多余逗号数量多少,只要第一行的真实列数正确,就能准确筛选出所有有效列
内容的提问来源于stack exchange,提问作者Harry Leboeuf
相关产品推荐
相关产品推荐

