如何在 Power shell 中使用 LINQ 查询对 csv 文件的第二列进行排序

时间:2021-02-15 13:05:25

标签: powershell linq

例如,我的列表( $dataList) 具有以下值 注意:每个文件的标题可能不同。我想传递列的位置而不是列名。

$dataList = new-object System.Collections.Generic.List[string]
CSV file example below

Code,name,gender 
1,BB,M
2,CC,M
3,DD,F



  $sortedValues = [Linq.Enumerable]::OrderBy($dataList, [Func[string,string]] { $args[0]})

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用 Import-Csv/ConvertFrom-Csv 解析数据,然后从第一条记录中获取列名:

$data = Import-Csv .\path\to.csv
$list = [System.Collections.Generic.List[psobject]]::new([psobject[]]$data)

$columnName = @($data[0].psobject.Properties)[1].Name

$sorted = [System.Linq.Enumerable]::OrderBy($list, [Func[psobject,string]]{ $args[0].$columnName })

如果您的文件很大并且您想避免使用 *-CSV 命令解析输入数据的开销,您需要做的就是跳过标题行:

$list = [System.Collections.Generic.List[string]]::new()
$header = Get-Content .\path\to.csv |Select -First 1
Get-Content .\path\to.csv |Select -Skip 1 |ForEach-Object {
    $list.Add($_)
}

# Remember to write header manually back to result file
$header |Set-Content .\path\to\result.csv

[System.Linq.Enumerable]::OrderBy($list, [Func[string,string]]{ $args[0].Split(',')[1] }) |Add-Content .\path\to\result.csv
相关问题