例如,我的列表($ 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]})
最简单的方法是使用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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句