2016-11-26 4 views
1

Ich habe eine TXT-Datei mit einem Inhalt, der durch eine leere Zeile begrenzt ist.Erhalte einen Teil eines Textes in eine Variable

Eg.

Question1 
What is your favourite colour? 

Question2 
What is your hobby? 

Question3 
What kind of music do you like? 

... und so weiter.

Ich würde gerne jede der Fragen in ein Array legen.

ich versucht, dieses

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

Aber es gibt mir jede Zeile in eine Variable.

Kann mir jemand einen Tipp geben?

Dank

+0

Also wollen Sie jedes Element im Array zwei Zeilen (die Frage Nummer + die Frage selbst)? –

+0

Ja, so dass $ Question1 "Question1
Was ist Ihre Lieblingsfarbe?" – CalinMihai24

Antwort

0

Wenn Sie nur ein Array möchten, können Sie auswählen, ob die Linien ? am Ende oder nicht:

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

Wenn Sie die Fragen, die von der gespeichert werden soll Vornamen, könnten Sie eine Hashtabelle verwenden.

starten, indem Sie die Datei als einzelne Zeichenfolge liest, dann durch zwei aufeinanderfolgende Zeilenumbrüche aufgeteilt:

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

Wenn Sie beiden Zeilen in jedem Array-Elemente möchten, können Sie hier stoppen.

aufgeteilt Ansonsten jeden Block in eine "Frage Name" und "Frage" Teil, verwenden jene Ihre hashtable zu füllen:

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

Jetzt können Sie die Fragen wie Zugang:

$Questions['Question1'] 
+0

Ja, so etwas. Danke vielmals. – CalinMihai24

1

Diese ist ein anderer Ansatz, der mehrzeilige Fragen bearbeiten kann und keine getrennte Leerzeile benötigt. Der Split ist ^Question, aber dieser Text ist nicht ausgeschlossen. Die Ausgabe erfolgt nach 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

andere Lösung 1

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

andere Lösung 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

andere Lösung 3

gc "C:\temp\test.txt" | ?{$_ -notmatch 'Question\d+' -and $_ -ne "" } 
Verwandte Themen