sorting - powershell: import-csv | get-member: sort column names / property names based on (original) position. rename colnames? -
the get-member commandlet returns noteproperties sorted alphanumerically. see sample output below.
from import-csv received array in memory, want get-member sort member names original position rather alphanumerical value.
the original sequence visible in $_.psextended.definition string ( column names joined commas)
i cannot in-place edit property names, it's read-only. workaround tried prepend numeric prefix column name, see code below
any better ideas? don't want in-place edit original data file.
$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 };
sample output of psextended
{file name, label, obsdatetime, port#, obs#, exp_flux, iv cdry, iv tcham, iv pressure, iv h2o, iv v3, iv v4, iv rh}
output of $colnames = $content | get-member | out-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
edit: (no answers yet)
here custom sorting function, need tell get-member use sorting function. how in pipeline?
#$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[$_] } }
i found answer in question pscustomobject hashtable
the in-memory data import-csv cmdlet pscustomobject.
its properties (column names) can fetched in original order code
#fetch in correct order $content.psobject.properties | # column names foreach { $ht2["$($_.name)"] = $_.value }
properties can renamed way, see
http://powershell.com/cs/blogs/tips/archive/2009/05/08/renaming-object-properties.aspx
dir | select-object @{name='filename'; expression={$_.name}}
Comments
Post a Comment