扫描多个字符串的txt文件并保存以下行

时间:2017-08-29 12:26:12

标签: powershell powershell-v4.0

我有一个问题,我试图解决,但是,由于我不存在PowerShell知识,它被证明比我希望的更难。所以任何帮助将不胜感激。

问题可以简化为:

  1. 在txtfile中查找字符串

  2. 提取该字符串后面的行的信息

  3. 将信息存储在句柄

  4. 在txtfile中查找第二个字符串并重复该过程

  5. 将两个字符串存储在新文件中或删除txt文件中的所有其他字符串。

  6. 然后我尝试为大约20k文件执行此操作。我希望在他们的关键字和逗号分隔下的信息,以便我可以在其他系统中导入它们。

    我的文件看起来有点像以下

    random words 
    that are unimportant 
    Keyword
    FirstlineofNumbersthatIwanttoExtract
    random words again that are unimportant 
    Secondkeyword
    SecondLineOfNumbersThatIWantToExtract
    end of the file 
    

    然而,就我想要提取的行所在的行而言,所有文件都不相似。我希望输出类似于

    Keyword, SecondKeyword
    FirstLineOfNumbersThatIWantToExtract, SecondLineOfNumbersThatIWantToExtract
    

    完成了。我到目前为止

     [System.IO.DirectoryInfo]$folder = 'C:\users\xx\Desktop\mappcent3'
    
     foreach ($file in ($folder.EnumerateFiles())) {
         if ($file.Extension -eq '.txt') {
    
             $content = Get-Content $file
    
             $FirstRegex = 'KeyWordOne
        (.+)$'
    
        $First_output = "\1"
        $test = Select-String -Path $file.FullName -Pattern $FirstRegex 
    
      }
    }
    

2 个答案:

答案 0 :(得分:3)

这会做类似于你要求的事情。这需要PowerShell 3.0 +

$path = 'C:\users\xx\Desktop\mappcent3'
$firstKeyword = "Keyword"
$secondKeyword = "Secondkeyword"
$resultsPath = "C:\Temp\results.csv"
Get-ChildItem $path -Filter "*.txt" | ForEach-Object{
    # Read the file in
    $fileContents = Get-Content $_.FullName

    # Find the first keyword data
    $firstKeywordData = ($fileContents | Select-String -Pattern $firstKeyword -Context 0,1 -SimpleMatch).Context.PostContext[0]

    # Find the second keyword data
    $secondKeywordData = ($fileContents | Select-String -Pattern $secondKeyword -Context 0,1 -SimpleMatch).Context.PostContext[0]

    # Create a new object with details gathered. 
    [pscustomobject][ordered]@{
        File = $_.FullName
        FirstKeywordData = $firstKeywordData
        SecondKeywordData = $secondKeywordData
    }

} | Export-CSV $resultsPath -NoTypeInformation

Select-String这就是大部分魔法。我们利用在比赛前后消耗线路的-Context。我们希望关注一个,这就是我们使用0,1的原因。将其包装在自定义对象中,然后我们可以将其导出到CSV文件。

关键字重叠

请注意,您的关键字可能会重叠并在输出文件中创建奇怪的结果。在您的示例中,关键字匹配多行,因此结果集将反映出来。

如果您只是想回写原始文件,那么您也可以轻松地执行此操作

"$firstKeywordData,$secondKeywordData" | Set-Content $_.FullName

或类似的东西。

答案 1 :(得分:3)

glibc cmdlet具有Select-String参数,可以轻松地在匹配的行之前或之后提取行。

您可以使用-Context导出到您需要的格式(尽管有20K文件可能需要直接写入输出文件)

Export-Csv