Конвертировать TXT в массив в PowerShell - PullRequest
0 голосов
/ 10 января 2019

У меня есть скрипт powershell и база данных txt с разным количеством элементов в строке.

Мой текстовый файл - list.txt:

"10345","doomsday","life","hope","run","stone"
"10346","ride","latest","metal"

Мой сценарий powershell search.ps1:

#Get file path
$path = Split-Path $script:MyInvocation.MyCommand.Path

$search = @()
Get-Content -LiteralPath "$path\list.txt" | ForEach-Object {
$search += $_
}

Итак, как преобразовать каждую строку как элемент массива? Как это:

$search = @(("10345","doomsday","life","hope","run","stone"),("10346","ride","latest","metal"))

Для работы как:

echo $search[0][0]

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Вот краткое решение PSv4 +:

$search = (Get-Content -LiteralPath $path\list.txt).ForEach({ , ($_ -split ',') })
  • Метод .ForEach() работает с каждой строкой, считанной из входного файла с помощью Get-Content.
  • $_ -split ',' разбивает каждую строку на массив строк по разделителю ,
  • , (...) оборачивает этот массив в aux. одноэлементный массив для обеспечения эффективного вывода массива в целом, что приводит к массиву массивов в качестве общего вывода.
    • Примечание. Строго говоря, метод .ForEach() выводит коллекцию [System.Collections.ObjectModel.Collection[psobject]], а не обычный массив PowerShell ([object[]]), но для всех практических целей оба типа действуют одинаково.

Примечание. Метод .ForEach() был выбран в качестве более быстрой альтернативы конвейеру с командлетом ForEach-Object (%) .
. Обратите внимание, что метод .ForEach() требует сначала сохранения входной коллекции в памяти в целом.


Более быстрая и более эффективная память, хотя, возможно, немного неясная альтернатива - это использование оператора switch с опцией -file:

$search = switch -file $path\list.txt { default { , ($_ -split ',') } }
  • switch -file обрабатывает каждую строку указанного файла.

  • Поскольку каждая строка должна обрабатываться, используется только ветвь default, в которой выполняется желаемое разбиение.

0 голосов
/ 11 января 2019

Предполагая, что вы не хотите, чтобы каждый элемент цитировался, вы можете рассмотреть не с использованием оператора -Split , а просто оценку каждой строки с помощью Invoke-Expression командлет или использование более безопасного [ScriptBlock] для этого:

$Search = Get-Content ".\list.txt" | ForEach-Object {,@(&([ScriptBlock]::Create($_)))}
0 голосов
/ 10 января 2019

Используйте -split. Фрагмент кода, который вы можете отлаживать в ISE или VSCode ниже.

$x1 = @'
"10345","doomsday","life","hope","run","stone"
"10346","ride","latest","metal"
'@

$data = $x1 -split "`r`n"

$data.Count

$data[0] -split ","

$arr = @()
foreach ($row in $data)
{
    $arr += ,($row -split ",")
}

"arr"
$arr

"0,3"
$arr[0][3]

"1,3"
$arr[1][3]

Таким образом, вы можете разбить каждую строку в вашем файле, возвращаемом из Get-Content, и добавить ее в свой новый массив, который позволяет вам ссылаться на то, как вы хотели ...

Существуют и другие способы использования ваших данных в зависимости от ваших потребностей.

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