我有一个问题,我试图解决,但是,由于我不存在PowerShell知识,它被证明比我希望的更难。所以任何帮助将不胜感激。
问题可以简化为:
在txtfile中查找字符串
提取该字符串后面的行的信息
将信息存储在句柄
在txtfile中查找第二个字符串并重复该过程
将两个字符串存储在新文件中或删除txt文件中的所有其他字符串。
然后我尝试为大约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
}
}
答案 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