使用数学因子替换字符串的一部分

时间:2016-08-29 21:03:31

标签: sql regex powershell replace

我正在使用PowerShell和MS Access。

我想将数学因子应用于此列值中管道内的内容。

实施例。给定系数为4时,-100.0必须变为-400.0且100.0必须变为400.0。

我只需要修改" Min_Value"和" Max_Value"令牌(硬编码)。

FiledValue来自数据库(有多行)。

FieldValue并不总是与此示例完全相同,但令牌模式始终与Ex相同。 MIN_VALUE = | ..... |

function Test
{
$Factor = 4

# Hard-coded SQL query result
$FieldValue = "Min_Value=|-100.0|;Max_Value=|100.0|;COMM_ID1=|1|;"

# Compare this value with a regular expression (Issue A: This doesn't work because of the minus sign and decimal)
if ($FieldValue -match "Min_Value=\|([0-9]+)\|;Max_Value=\|([0-9]+)\|;")
{   
    # Trying to retreive -100.0 here...(Issue B: this doesn't work). I beleive I can only specify ||, not Min_Value=||
    $TokenMinValue = $FieldValue.Split('Min_Value=||')[1]
    $TokenMaxValue = $FieldValue.Split('Max_Value=||')[1]

    # Trying to take the token (-100.0), multiply it by 4 and write it back where I found it (Issue C: this obvioulsy doesn't work)
    $Result = $FieldValue -replace "$regex",($TokenMinValue * $Factor)
    $Result = $FieldValue -replace "$regex",($TokenMaxValue * $Factor)

    #The goal is for $Result to equal "Min_Value=|-400.0|;Max_Value=|400.0|;COMM_ID1=|1|;"
}
}

1 个答案:

答案 0 :(得分:1)

您没有指定您的DBMS,因此这是使用>>> stats.cauchy.fit(arr, floc=10) (10, 2.4905786982353786) >>> stats.norm.fit(arr, floc=10) (10, 3.3686549590571668) 的解决方案。至少你可以遵循它背后的逻辑:

Postgres

魔术就是这样:

  1. select concat( replace( concat('Min_Value=|', string_agg(intval,';')), ';', '|;Max_Value=|'), '|;') from ( select (unnest(regexp_matches('Min_Value=|10|;Max_Value=|100|;', 'Min_Value=\|([0-9]+)\|;Max_Value=\|([0-9]+)\|;'))::int*4)::TEXT as intval ) foo; 从输入字符串中提取两个整数
  2. 使用regexp_matches将数组解压缩为两个单独的行
  3. 将这些整数值(目前是文本)转换为unnest并乘以因子Integer
  4. 使用4string_agg作为分隔符,使一个字符串行包含由;分隔的整数
  5. 使用;在开头添加concat,因此字符串现在为Min_Value=|
  6. 使用Min_Value=|40;400并将replace替换为下一部分 - ;,以便字符串现在为|;Max_Value=|
  7. 再次使用Min_Value=|40|;Max_Value=|400concat附加到字符串
  8. 的末尾

    <强>输入:

    |;

    <强>结果:

    Min_Value=|10|;Max_Value=|100|;