【问题标题】:When a word matches retrieve the varying string after it当一个单词匹配时检索它之后的变化字符串
【发布时间】:2018-10-04 20:59:57
【问题描述】:

我有一个如下所示的查询:

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。 谁能帮助我如何将第二张表也作为输出?

【问题讨论】:

  • 您在寻找(Get-Content -Path query1.txt | Where-Object {$_ -match 'JOIN'}) -replace '^.*JOIN\s(.*)$','$1' 吗?

标签: powershell loops foreach split match


【解决方案1】:

使用Select-String处理您的数据:

$data | Select-String -AllMatches -Pattern '(?<=join\s+)\S+' |
    Select-Object -Expand Matches |
    Select-Object -Expand Groups |
    Select-Object -Expand Value

(?&lt;=...) 是一个所谓的正向lookbehind 断言,用于匹配模式而不包含在返回的字符串中(意味着返回的匹配只是表名,前面没有JOIN)。

【讨论】:

  • 非常感谢!这确实适用于表称为 TableA 的情况。如果加入后的单词是 Table.A as TableA 它将不起作用。
  • @Nab 显然,如果您的表名也可能包含非单词字符,您需要调整模式。查看更新的答案。
【解决方案2】:

这是我寻找所需表名的天真尝试。

将空格上的数据输入拆分成一个数组,找到单词“JOIN”的索引,然后访问单词“JOIN”之后的以下索引。

$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

如果您期望不同的输入文件,您可以根据需要调整大小写(看到您将输入设置为全小写)等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 2015-04-08
    • 2022-01-23
    • 2019-09-18
    • 2023-03-11
    • 2017-04-02
    相关资源
    最近更新 更多