例如,我的列表( $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]})
答案 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