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

如何用PowerShell提取所有CSV文件的第三列并保存到新文件

解决CSV批量提取第三列的问题

问题场景

我有一个包含子文件夹的目录,里面存了大量CSV文件。需要为每个CSV提取第三列内容,保存到对应的新文件(比如原文件是filedata1.csv,新文件就是filedata1column3.csv)。

示例:
原文件filedata1.csv内容:

aa,bb,cc
cat,horse,"dog, bird"
4th,33,first and second

期望生成的filedata1column3.csv内容:

cc
dog, bird
first and second

我写的代码存在错误,代码如下:

param ( [String] $Filename  = '*.csv',
            [String] $SourceDir = 'C:\Data\',
    )
    
ForEach ($csvFile in Get-ChildItem -Path $SourceDir -Filter $Filename){
            (Import-Csv $csvFile)
            cut -d, -f 3 *.csv > *column3.csv
}

原代码的错误点

  1. 参数语法错误:SourceDir参数后面多了逗号,不符合PowerShell的参数定义规范;
  2. 工具混用错误:cut是Linux系统的命令,PowerShell中无法直接使用,而且它会把CSV字段内的逗号当成分隔符,无法正确识别带引号的字段;
  3. 未针对单个文件处理:循环里用*.csv和*column3.csv是批量操作,没有对应到当前遍历的单个文件,会导致所有文件内容混在一起;
  4. 无效的Import-Csv调用:只读取了CSV文件但没有对数据做任何提取处理。

修正后的PowerShell代码

param (
    [String] $Filename = '*.csv',
    [String] $SourceDir = 'C:\Data\'
)

# 遍历目录及子目录下的所有CSV文件
Get-ChildItem -Path $SourceDir -Filter $Filename -Recurse | ForEach-Object {
    # 生成输出文件的路径(和原文件同目录,文件名加column3后缀)
    $outputPath = Join-Path -Path $_.DirectoryName -ChildPath "$($_.BaseName)column3.csv"

    # 读取CSV并自动解析带引号的字段
    $csvContent = Import-Csv -Path $_.FullName
    # 获取第三列的列名(索引从0开始,第三列对应索引2)
    $thirdColName = $csvContent[0].PSObject.Properties.Name[2]

    # 提取第三列内容(包含表头)
    $thirdColumnData = $csvContent | Select-Object -ExpandProperty $thirdColName

    # 将内容写入输出文件,编码用utf8保证兼容性
    $thirdColumnData | Out-File -Path $outputPath -Encoding utf8
}

可选调整

如果不需要输出表头,只需要数据行,可以把提取第三列的代码改成:

# 跳过表头,只提取数据行
$thirdColumnData = $csvContent | Select-Object -ExpandProperty $thirdColName | Select-Object -Skip 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:25:00