我的查询如下:
FROM TableA
INNER JOIN TableB
ON TableA.xx = TableB.xx
INNER JOIN TableC
ON TableA.yy = TableC.yy
我正在尝试编写一个脚本,用于选择“JOIN”一词之后的表格。
我现在写的脚本是:
$data = Get-Content -Path query1.txt
$dataconv = "$data".ToLower() -replace '\s+', ' '
$join = 0
$overigetabellen = ($dataconv) | foreach {
if ($_ -match "join (.*)") {
$join++
$join = $matches[1].Split(" ")[0]
#Write-Host "Table(s) on which is joined:" $join"."
$join
}
}
$overigetabellen
这只给了我第一个表,所以TableB。 任何人都可以帮助我如何获得第二个表作为输出?
答案 0 :(得分:2)
使用Select-String
处理您的数据:
$data | Select-String -AllMatches -Pattern '(?<=join\s+)\S+' |
Select-Object -Expand Matches |
Select-Object -Expand Groups |
Select-Object -Expand Value
(?<=...)
是一个所谓的正向lookbehind断言,用于匹配模式而不包含在返回的字符串中(意味着返回的匹配只是在它们之前没有JOIN
的表名)
答案 1 :(得分:1)
这是我寻找所需表名的天真尝试。
将空格上的数据输入拆分成数组,找到单词&#34; JOIN&#34;的索引,然后在单词&#34; JOIN之后访问以下索引。&#34;
$data = Get-Content -Path query1.txt
$indices = @()
$output = @()
$dataarray = $data -split '\s+'
$singleIndex = -1
Do{
$singleIndex = [array]::IndexOf($dataarray,"JOIN",$singleIndex + 1)
If($singleIndex -ge 0){$indices += $singleIndex}
}While($singleIndex -ge 0)
foreach ($index in $indices) {
$output += $dataarray[$index + 1]
}
输出:
表B
表C
如果您需要不同的输入文件,可以根据需要调整大小写(看到您将输入设置为全部小写)等。