Разделение Get-Content, но ведущие нули и разделение ведутся только по первому '_' в powershell - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть некоторые txt-данные, подобные этому:

0.0.0.1_03_1          
0.0.0.1_03            
0.0.0.1_02_2_1_3_4          
0.0.0.1_02_1          
0.0.0.1_02            
0.0.0.1_01_1          
0.0.0.1_01  

Чего я хочу добиться, это разделить две переменные (0.0.0.1 и остальные), которые я хочу разделить только по первым '_' идля сохранения начальных нулей (например, 01) я делаю так:

Get-Content $SourceTxtDbFile | 
  ConvertFrom-String -Delimiter "_" -PropertyNames DbVersion, ScriptNumber

, но результат не имеет ведущих нулей и не разбивает строки так, как я хочу.

Ответы [ 3 ]

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

Альтернативный подход RegEx:

> gc .\file.txt|?{$_ -match "^([^_]+)_(.*) *$"}|%{[PSCustomObject]@{DBVersion=$Matches[1];ScriptNumber=$Matches[2]}}

DBVersion ScriptNumber
--------- ------------
0.0.0.1   03_1
0.0.0.1   03
0.0.0.1   02_2_1_3_4
0.0.0.1   02_1
0.0.0.1   02
0.0.0.1   01_1
0.0.0.1   01

То же самое без псевдонимов:

Get-Content .\file.txt|
  Where-Object {$_ -match"^([^_]+)_(.*) *$"} | 
    ForEach-Object {
      [PSCustomObject]@{
        DBVersion   = $Matches[1]
        ScriptNumber= $Matches[2]
      }
    }

RegEx "^([^_]+)_(.*) *$" также удаляет завершающие пробелы из вашего опубликованного образцалинии.

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

Полезный ответ TessellatingHeckler показывает, как использовать метод .Split() для выполнения разделения на основе разделителя, которое ограничивает число возвращаемых токенов, которые в его решении разделяются только на 1st _ экземпляр, чтобы вернуть всего 2 токенов.

В качестве отступления: вы также можете использовать собственный -split оператор PowerShell , чье использование имеет свои преимущества :

$_ -split '_', 2 # in this case, same as: $_.split('_', 2) 

Тем не менее, ваши последующие комментарии предполагают, что вы можете просто удалить все после 2-го _ экземпляра из вашеговходные строки.

$dbVersion, $scriptNumber, $null  = $_ -split '_', 3 # -> e.g., '0.0.0.1', 03', '1'

Обратите внимание, как указание $null в качестве переменной для получения третьего действующего токена отбрасывает этот токен, учитывая, что он нам не интересен.

Чтобы повторно объединить 2 полученных токена с _, проще всего использовать оператор -join:

$dbVersion, $scriptNumber -join '_'

Чтобы сложить все вместе:

# Sample array of input lines.
$lines=@'
0.0.0.1_03_1
0.0.0.1_03
0.0.0.1_02_2_1_3_4
0.0.0.1_02_1
0.0.0.1_02
0.0.0.1_01_1
0.0.0.1_01
'@ -split '\r?\n'

# Use Get-Content $SourceTxtDbFile instead of $lines in the real world.
$lines | ForEach-Object {
  # Split by the first two "_" and save the first two tokens.      
  $dbVersion, $scriptNumber, $null = $_ -split '_', 3
  # Re-join the first two tokens with '_'and output the result.
  $dbVersion, $scriptNumber -join '_'
}

С вашим примером ввода это дает:

0.0.0.1_03
0.0.0.1_03
0.0.0.1_02
0.0.0.1_02
0.0.0.1_02
0.0.0.1_01
0.0.0.1_01
0 голосов
/ 22 ноября 2018

Ограничьте количество разбиений с помощью .Split($separator, $count), а затем создайте собственные выходные объекты:

Get-Content D:\test.txt | ForEach-Object {

    $Left, $Right = $_.split('_', 2)

    [PsCustomObject]@{ 
        DbVersion    = $Left.Trim()
        ScriptNumber = $Right.Trim()
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...