Мне нужно извлечь столбцы из текстового файла, описанного в этом посте:
но я должен сделать это и в Windows Server 2008, на котором не установлен Perl. Как я могу сделать это с помощью PowerShell? Любые идеи или ресурсы? Я новичок в PowerShell...
Мне нужно извлечь столбцы из текстового файла, описанного в этом посте:
но я должен сделать это и в Windows Server 2008, на котором не установлен Perl. Как я могу сделать это с помощью PowerShell? Любые идеи или ресурсы? Я новичок в PowerShell...
Попробуй это:
Get-Content test.txt | Foreach {($_ -split '\s+',4)[0..2]}
И если вы хотите, чтобы данные в этих столбцах печатались в одной строке:
Get-Content test.txt | Foreach {"$(($_ -split '\s+',4)[0..2])"}
Обратите внимание, что для этого требуется PowerShell 2.0 для оператора -split
. Кроме того, ,4
сообщает оператору разделения максимальное количество разделяемых строк, которые вы хотите, но имейте в виду, что последняя строка всегда будет содержать все объединенные дополнения.
Для столбцов с фиксированной шириной вот один из подходов для ширины столбца, равной 7 ($w=7):
$res = Get-Content test.txt | Foreach {
$i=0;$w=7;$c=0; `
while($i+$w -lt $_.length -and $c++ -lt 2) {
$_.Substring($i,$w);$i=$i+$w-1}}
$res будет содержать каждый столбец для всех строк. Чтобы установить максимальное количество столбцов, измените $c++ -lt 2
с 2 на что-то другое. Вероятно, есть более элегантное решение, но сейчас нет времени его обдумывать. :-)
Предполагая, что этот код разделен пробелами, он должен работать.
$fileName = "someFilePath.txt"
$columnToGet = 2
$columns = gc $fileName |
%{ $_.Split(" ",[StringSplitOptions]"RemoveEmptyEntries")[$columnToGet] }
К обычному、
type foo.bar | % { $_.Split(" ") | select -first 3 }
Попробуй это. Это поможет пропустить начальные строки, если вы хотите, извлечь/перебрать столбцы, отредактировать данные столбца и перестроить запись:
$header3 = @("Field_1","Field_2","Field_3","Field_4","Field_5")
Import-Csv $fileName -Header $header3 -Delimiter "`t" | select -skip 3 | Foreach-Object {
$record = $indexName
foreach ($property in $_.PSObject.Properties){
#doSomething $property.Name, $property.Value
if($property.Name -like '*CUSIP*'){
$record = $record + "," + '"' + $property.Value + '"'
}
else{
$record = $record + "," + $property.Value
}
}
$array.add($record) | out-null
#write-host $record
}