2016-11-26 3 views
1

У меня есть .txt-файл с содержимым, которое ограничено пустой строкой.Получите часть текста в переменную

Например.

Question1 
What is your favourite colour? 

Question2 
What is your hobby? 

Question3 
What kind of music do you like? 

... и так далее.

Я хотел бы поместить каждый из текстовых вопросов в массив.

Я попробовал этот

$path=".\Documents\Questions.txt" 
$shareArray= gc $path 

Но это дает мне каждую строку в переменную.

Может кто-нибудь дать мне совет?

Благодаря

+0

Итак, вы хотите, чтобы каждый элемент в массиве представлял собой две строки (номер вопроса + сам вопрос)? –

+0

Да, чтобы $ Question1 был «Question1
Какой твой любимый цвет?» – CalinMihai24

ответ

0

Если вы хотите массив, можно фильтровать ли у линии ? в конце или нет:

$Questions = Get-Content $path |Where-Object {$_.Trim() -match '\?$'} 

Если вы хотите сохранить вопросы, затронутые предыдущее имя, вы можете использовать хеш-таблицу.

Начните с чтения файла в виде одной строки, а затем разделить на два последовательных разрывов строк:

$Blocks = (Get-Content $path -Raw) -split '\r?\n\r?\n' |ForEach-Object { $_.Trim() } 

Если вы хотите обе строки в каждом элементе массива, вы можете остановиться здесь.

В противном случае разделить каждый блок в «имя вопроса» и «вопрос» часть, использовать их для заполнения Вашего Hashtable:

$Questions = @{} 
$Blocks |ForEach-Object { 
    $Name,$Question = $_ -split '\r?\n' 
    $Questions[$Name.Trim()] = $Question 
} 

Теперь вы можете получить доступ к таким вопросам, как:

$Questions['Question1'] 
+0

Да, что-то в этом роде. Большое спасибо. – CalinMihai24

1

Этих это другой подход, который может обрабатывать многострочные вопросы и не требует отдельной разделительной линии. Разделение - ^Question, но этот текст не исключается. Выход - Out-Gridview.

## LotPings 2016-11-26 
$InFile = ".\Questions.txt" 

## prepare Table 
$Table = New-Object system.Data.DataTable 
$col = New-Object system.Data.DataColumn "QuestionNo",([string]) 
$Table.columns.add($col) 
$col = New-Object system.Data.DataColumn "QuestionBody",([string]) 
$Table.columns.add($col) 

## prepare RegEx for the split 
$Delimiter = [regex]'Question' 
$Split  = "(?!^)(?=$Delimiter)" 

(Get-Content $InFile -Raw) -split $Split | 
    ForEach-Object { 
    If ($_ -match '(?smi)^(?<QuestionNo>Question\d+)(*)(?<QuestionBody>.*)$') { 
     $Row = $Table.Newrow() 
     $Row.QuestionNo = $matches.QuestionNo.Trim() 
     $Row.QuestionBody = $matches.QuestionBody.Trim() 
     $Table.Rows.Add($Row) 
    } else {Write-Host "no Match"} 
    } 
$Table | Out-Gridview 

enter image description here

0

другое решение 1

select-string -Path "C:\temp\test.txt" -Pattern "Question[0-1]*" -Context 0,1 | 
    % {$_.Context.PostContext} | 
     out-file "c:\temp\result.txt" 
0

другое решение 2

[email protected]" 
{Question*:Question1} 
{Text:an example of question?} 

{Question*:Question2} 
{Text:other example of question with Upper and digits 12} 
"@ 

gc "C:\temp\test.txt" | ConvertFrom-String -TemplateContent $template | select Text 
0

другое решение 3

gc "C:\temp\test.txt" | ?{$_ -notmatch 'Question\d+' -and $_ -ne "" } 
Смежные вопросы