将文本的一部分写入变量

时间:2016-11-26 19:36:03

标签: powershell

我有一个.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

但它给了我每一行变量。

有人可以给我一个提示吗?

谢谢

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果你只想要一个数组,你可以过滤掉最后一行是否import java.util.ArrayList; import java.util.List; public class stack { public List<Integer> list=new ArrayList<>(5); public void scaleByK() { int size=list.size(); for (int i = 0; i < size; i=i+list.get(i)) { if (list.get(i) < 0 || list.get(i) == 0) { list.remove(i); size--; } for (int j = 1; j < list.get(i); j++) { list.add(i + j, list.get(i)); size++; } } for(int i=0;i<list.size();i++){ System.out.println(list.get(i)); } } public static void main(String arg[]){ stack s1=new stack(); s1.list.add(2); s1.list.add(4); s1.list.add(-2); s1.list.add(5); s1.list.add(3); s1.list.add(0); s1.list.add(7); s1.scaleByK(); }

?

如果您想按前面的名称存储问题,可以使用哈希表。

首先将文件作为单个字符串读取,然后分成两个连续的换行符:

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

如果你想在每个数组项中都有两行,你可以在这里停止。

否则将每个块拆分为&#34;问题名称&#34;和&#34;问题&#34;部分,使用它们来填充哈希表:

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

现在您可以访问以下问题:

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

答案 2 :(得分:0)

其他解决方案1 ​​

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

答案 3 :(得分:0)

其他解决方案2

$template=@"
{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

答案 4 :(得分:0)

其他解决方案3

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