Power Shell CSV преобразование - PullRequest
0 голосов
/ 15 ноября 2018

Привет! Я пытаюсь экспортировать текстовый файл в формат csv в Powershell, но сталкиваюсь с проблемой выравнивания. Данные поступают неправильно.

Ввод текста

clexec.py "top -d1|grep Swap"
NVA-0055-Prod-N08:Swap: 48G Total, 1428K Used, 48G Free
NVA-0055-Prod-N01:Swap: 48G Total, 332K Used, 48G Free
NVA-0055-Prod-N04:Swap: 48G Total, 169M Used, 48G Free
NVA-0055-Prod-N05:Swap: 48G Total, 884K Used, 48G Free
NVA-0055-Prod-N02:Swap: 48G Total, 4236K Used, 48G Free
NVA-0055-Prod-N06:Swap: 48G Total, 132K Used, 48G Free
NVA-0055-Prod-N07:Swap: 48G Total, 92K Used, 48G Free
NVA-0055-Prod-N03:Swap: 48G Total, 712K Used, 48G Free

Я использую нижекоманда

$a= import-csv 'C:\Users\PDC_AVERE_SWAP_OP.txt' -Delimiter 't' -Header 'Name','Total','used','free'
$a | export-csv csvfile.csv -NoTypeInformation

Мой вывод будет выглядеть следующим образом

enter image description here

после исправления части разделителя Я получаю все данные в одномстолбец, но мне нужно, чтобы он был разделен между столбцами Всего, используется и бесплатно

enter image description here

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

используйте «t» вместо «t» в качестве Delimeter и вместо Export-CSV вы можете использовать следующий код,

 "Name,Total,used,free" | Set-Content csvfile.csv

 $a  |   %{ Write-Output "$($_.Name),$($_.Total),$($_.free),$($_.free)"  |  out-file csvfile.csv -Encoding  ascii  -Append  -Force   } 
0 голосов
/ 15 ноября 2018

Если вы хотите удалить начальную строку из файла,
вы можете прочитать содержимое как текст и пропустить первую строку до ConvertFrom-Csv

Get-Content 'C:\Users\PDC_AVERE_SWAP_OP.txt' | Select-Object -Skip 1|
  ConvertFrom-Csv -Delimiter "`t" -Header Name,Total,used,free |
    Export-Csv csvfile.csv -NoTypeInformation

На всякий случай, если нет вкладки, нопробел (ы), как в примере выше, вы можете использовать

$Data = Get-Content '.\PDC_AVERE_SWAP_OP.txt' |Select-Object -skip 1| ForEach-Object{
    $Name,$Total,$used,$free = ($_ -split('\s+'))[0,1,3,5]
    [PSCustomObject]@{
       Name = $Name
       Total= $Total
       used = $used
       free = $free
    }
}
$Data
$Data | Export-Csv '.\PDC_AVERE_SWAP_OP.csv' -NoTypeInformation
$Data | Export-Excel  '.\PDC_AVERE_SWAP_OP.xlsx' -AutoSize -Show

и тем самым убрать метку из каждого значения:

Name                    Total used  free
----                    ----- ----  ----
NVA-0055-Prod-N08:Swap: 48G   1428K 48G
NVA-0055-Prod-N01:Swap: 48G   332K  48G
NVA-0055-Prod-N04:Swap: 48G   169M  48G
NVA-0055-Prod-N05:Swap: 48G   884K  48G
NVA-0055-Prod-N02:Swap: 48G   4236K 48G
NVA-0055-Prod-N06:Swap: 48G   132K  48G
NVA-0055-Prod-N07:Swap: 48G   92K   48G
NVA-0055-Prod-N03:Swap: 48G   712K  48G

При использовании Export-Excel вы непосредственно получите файл xlsx

enter image description here

РЕДАКТИРОВАТЬ: как уже упоминалось в комментарии здесь вариант с использованием RegEx для разделения элементов См. RegEx live https://regex101.com/r/GFXpXw/1 с отсутствующим используемым значением

## Q:\Test\2018\11\15\SO_53322626_2.ps1

$RE = "^(?<Name>[^ ]+) (?<Total>\d+[KMG]) Total(, (?<used>\d+[KMG]) Used)?, (?<free>\d+[KMG])"

$Data = Get-Content '.\PDC_AVERE_SWAP_OP.txt' |Select-Object -skip 1| ForEach-Object{
    if ($_ -match $RE){
        [PSCustomObject]@{
           Name = $Matches.Name
           Total= $Matches.Total
           used = $Matches.used
           free = $Matches.free
        }
    } else {Write-Host ("{0} didn't match RegEx" -f $_)}
}
$Data
$Data | Export-Csv '.\PDC_AVERE_SWAP_OP.csv' -NoTypeInformation
#$Data | Export-Excel  '.\PDC_AVERE_SWAP_OP.xlsx' -AutoSize
0 голосов
/ 15 ноября 2018

Проблема -Delimiter 't'. Это буквально означает, что буква t является символом-разделителем. Скорее всего, вы имеете в виду символ табуляции, который в Powershell имеет значение backtick-t: `t.

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