powershell: import-csv |get-member: сортировка имен столбцов / имен свойств на основе (оригинальной) позиции.переименовать имена? - PullRequest
2 голосов
/ 29 апреля 2011

Командлет 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, Порт №, Obs #, Exp_Flux, IV Cdry, IV Чам, IV Давление, IV H2O, IV V3, IV V4, IV RH}

Вывод $ 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

РЕДАКТИРОВАТЬ: (пока нет ответов)

Вот пользовательская функция сортировки, теперь мне нужно сказать 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[$_] }

 }

Ответы [ 3 ]

1 голос
/ 02 мая 2011

Я нашел ответ на вопрос PSCustomObject to Hashtable

Данные в памяти из командлета import-csv являются объектами 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}}
0 голосов
/ 08 сентября 2014

Я подошел к этому немного по-другому при обработке файла 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"

Меньше "могущественного", но легко достижимого ...

0 голосов
/ 29 апреля 2011

Просто след:

$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 $_}

}

Очевидно, что это полезно и выполнимо, если вы теперь заранее $ mysortedvalues.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...