get-member命令行开关返回NoteProperties,总是按字母顺序排序。请参阅下面的示例输出。
从import-csv我在内存中收到一个数组,现在我想让get-member按原始位置而不是字母数字值对成员名称进行排序。
原始序列在$ _。psextended.Definition字符串中可见(用逗号连接的列名称)
我无法就地编辑属性名称,因为它是只读的。 在我解决方法时,我尝试在列名前加一个数字前缀,请参阅下面的代码
有更好的想法吗? 我不想就地编辑原始数据文件。
$content = (import-csv -delimiter "`t" $infile_abs );
$colnames = $content | get-Member | where-object {$_.MemberType -eq "NoteProperty"} ; #| out-gridview;
$cols = $content | get-Member -force | where-object {$_.Name -eq "psextended"} ;
echo($cols.Definition -replace "psextended" , "");
$i = 0;
$colnames| sort-object -descending | foreach-object {
$i++ ;
$cn = [string]::Format( "{0:00}_{1}", $i, $_.Name ) ;
Write-Host $cn
};
psextended的样本输出
{文件名,标签,ObsDateTime, Port#,Obs#,Exp_Flux,IV Cdry,IV Tcham,IV压力,IV H2O,IV V3,IV V4,IV RH}
$ colnames = $ content |的输出get-Member |出gridview的;
Exp_Flux NoteProperty System.String Exp_Flux=0,99
File Name NoteProperty System.String File Name=xxx-11040
IV Cdry NoteProperty System.String IV Cdry=406.96
IV H2O NoteProperty System.String IV H2O=9.748
IV Pressure NoteProperty System.String IV Pressure=100.7
IV RH NoteProperty System.String IV RH=53.12
IV Tcham NoteProperty System.String IV Tcham=16.19
IV V3 NoteProperty System.String IV V3=11.395
IV V4 NoteProperty System.String IV V4=0.759
Label NoteProperty System.String Label=5m
Obs# NoteProperty System.String Obs#=1
ObsDateTime NoteProperty System.String ObsDateTime=2011-04-04 13:19:37
Port# NoteProperty System.String Port#=1
编辑:(还没有答案)
这是一个自定义排序功能,现在我需要告诉Get-Member使用这个排序功能。如何在管道中执行此操作?
#$orig_seq = $cols.Definition -replace "psextended", "" -replace "[{}]", "";
$orig_seq = "File Name, Label, ObsDateTime, Port#, Obs#, Exp_Flux, IV Cdry, IV Tcham, IV Pressure, IV H2O, IV V3, IV V4, IV RH";
echo $orig_seq;
#exit;
&{
$byPos= @{};
$i = 0;
$orig_seq.Split(",") | % { $byPos[$i++] = $_.trim()}
$order = ([int[]] $byPos.keys) | sort
#$order | %{ ([string]::Format( "{0} => {1}", $_, $byPos[$_])) }
$order | %{ $byPos[$_] }
}
答案 0 :(得分:1)
我找到了有问题的答案 PSCustomObject to Hashtable
import-csv cmdlet中的内存数据是PSCustomObject。
可以使用此代码
以原始顺序获取其属性(列名称) #fetch in correct order
$content.psobject.properties |
# do something with the column names
Foreach { $ht2["$($_.Name)"] = $_.Value }
可以通过这种方式重命名属性,参见
http://powershell.com/cs/blogs/tips/archive/2009/05/08/renaming-object-properties.aspx
dir | Select-Object @{Name='FileName'; Expression={$_.Name}}
答案 1 :(得分:0)
只是一个痕迹:
$myorder = $orig_seq.split(",") foreach $myobject in $myobjects { $myorder | % {get-member -name $_ -inputobject $myobject} }
编辑:获取排序值
$myorder = $orig_seq.split(",") foreach $myobject in $myobjects { $mysortedvalues | ? {$myobject.name -eq $_} }
显然,如果您现在预先提供$ mysorted值,这是有用且可行的。
答案 2 :(得分:0)
我在处理CSV文件时以稍微不同的方式处理了这个问题:
# Create a stream object where $filepath is the CSV file you're processing
$stream = [System.IO.File]::Open($filepath, [System.IO.FileMode]::Open)
# Create a reader of the stream, yes there are more efficient ways to do this
$reader = New-Object -typename System.IO.StreamReader -argumentlist $stream
# Output the first line to the target CSV file you're processing then move on...
$reader.ReadLine() | Out-File $outpath -Encoding "ASCII"
少'强大',但很容易实现......