Розбиття рядка на окремі змінні


Відповіді:


140

Подобається це?

$string = 'FirstPart SecondPart'
$a,$b = $string.split(' ')
$a
$b

7
Якщо у вас є "FirstPart SecondPart ThirdPart"і потрібно лише два, ви можете використовувати$a,$b = $string.split(' ')[0,1]
Стоїнов

Якщо у вас $ string = 'FirstPart - SecondPart' і $ a, $ b = $ string.split ('-'), додайте ..Trim () ($ a, $ b = $ string.split ('-') .Trim ()), тоді обрізано і $ a, і $ b
mortenma71,

52

За допомогою -splitоператора створюється масив . Як так,

$myString="Four score and seven years ago"
$arr = $myString -split ' '
$arr # Print output
Four
score
and
seven
years
ago

Коли вам потрібен певний елемент, використовуйте індекс масиву, щоб досягти його. Пам’ятайте, що показник починається з нуля. Як так,

$arr[2] # 3rd element
and
$arr[4] # 5th element
years

6
Або еквівалентно:$arr = @($myString.split(' '))
sxc731

2
Також може бути однокласник:$first_word = ("one-two-three" -split '-')[0]
information_interchange

2
@ sxc731: .Split()завжди повертає масив, тому немає потреби в @(...):, $arr = $myString.split(' ')але зауважте, що більш ідіоматичне рішення PowerShell $arr = $myString -split ' ', вже є частиною відповіді. Однак зауважте, що -splitце регулярне вираження та не враховує регістр (використовуйте -csplitдля розділення з урахуванням регістру).
mklement0

25

Важливо відзначити таку різницю між двома методами:

$Str="This is the<BR />source string<BR />ALL RIGHT"
$Str.Split("<BR />")
This
is
the
(multiple blank lines)
source
string
(multiple blank lines)
ALL
IGHT
$Str -Split("<BR />")
This is the
source string
ALL RIGHT 

З цього видно, що string.split() метод :

  • виконує розділення з урахуванням регістру (зверніть увагу, що "ALL RIGHT" його розділення на "R", але "зламаний" не розділяється на "r")
  • розглядає рядок як список можливих символів, на які слід розділити

Поки -split оператор :

  • виконує порівняння без урахування регістру
  • лише розбивається на весь рядок

4
Це хороші відмінності, на які слід звернути увагу; інший важливий - це те, що регулярний вираз (регулярний вираз) -splitприймається як свій (перший) операнд RHS, тоді як метод типу працює на буквальний символ / масив символів / і - в .NET Core - також літеральний рядок . Також зверніть увагу, що правильним синтаксисом у PowerShell є ; в той час як синтаксис псевдо-метод відбувається з роботою в цьому випадку, слід уникати. [string].Split()$Str -split '<BR />'$Str -Split("<BR />")
mklement0

9

Спробуйте це:

$Object = 'FirstPart SecondPart' | ConvertFrom-String -PropertyNames Val1, Val2
$Object.Val1
$Object.Val2

ConvertFrom-String - найкраще рішення. Слід зазначити, що ConvertFrom-String насправді розроблений з конкретним наміром розділити та об'єктивувати рядки інформації, що саме те, що OP бажає. Слід також зазначити, що, хоча розділений командлет працює, потрібні додаткові маніпуляції, щоб отримати те, що хоче OP, про що дбає ConvertFrom-String.
danno

1
@danstermeister: Як правило, використання командлета для простого розбиття рядків неефективно. Зокрема, ConvertFrom-Stringвін застарілий і його слід уникати (він завжди мав експериментальне відчуття, і той факт, що він не був включений до PowerShell Core, де зосереджені майбутні зусилля з розробки, свідчить про те, що він тут не для того, щоб залишатися). Що стосується необхідності додаткових маніпуляцій: виконуватиметься деструктуризація:$val1, $val2 = 'FirstPart SecondPart' -split ' '
mklement0

За замовчуванням ви можете це зробити: $ Object = 'FirstPart SecondPart' | ConvertFrom-Csv -d '' -H Val1, Val2 (те саме з Core 6);)
Есперенто57

1
@ mklement0 - Розробники PowerShell досі не імпортували всі елементи, орієнтовані на Windows, через необхідну роботу бекенда, але сповільнюють досягнення такої для фактичної парності функцій. Отже, якщо це не було застарілим у Windows PowerShell, я б не обов'язково рахував це. Наприклад, команди netadapter, я вважаю, будуть перенесені найближчим часом, але сьогодні їх не існує. Це просто відсутність в даний час в Ядрі абсолютно не передбачає його існування в Ядрі в майбутньому. А проблеми ефективності командлету краще доручити реальним розробникам, а не програмним сценаріям.
danno

@danstermeister: Правда, за відсутності додаткової інформації ви не можете зробити висновок, що вона не буде перенесена з поточної відсутності - лише, що це не було пріоритетом . Це спірне питання, однак, оскільки всі ConvertFrom-String«S вроджених проблем є достатньою причиною , щоб уникнути цього. Це особливо стосується розбору на основі шаблону, але навіть синтаксичний розбір на основі роздільника є недосконалим через висновок типу, який незмінно застосовується - див. Stackoverflow.com/a/50166580/45375 .
mklement0

0

Оператор операції foreach-object:

$a,$b = 'hi.there' | foreach split .
$a,$b

hi
there
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.