2016-08-29 2 views
0

PowerShell 및 MS Access를 사용하고 있습니다.수학 인수를 사용하여 문자열 부분 바꾸기

이 열 값의 파이프 내부에 수학 요인을 적용하고 싶습니다.

Ex. factor가 4이면 -100.0은 -400.0이되어야하고 100.0은 400.0이되어야합니다.

"Min_Value"및 "Max_Value"토큰 (하드 코딩 된) 만 수정하면됩니다.

FiledValue는 데이터베이스에서옵니다 (여러 행이 있음).

FieldValue는 항상이 예제와 정확히 동일하지 않지만 토큰 패턴은 항상 동일합니다. 예. 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|;" 
} 
} 
+0

은 SQL에서 2 & 3도 가능합니까? – sln

+0

코드는 어디에 있습니까? 지금까지 뭐 해봤 어? – Marusyk

+0

다음은 어떻게 해결 한 것입니까? $ factor = 25.4 $ minRegex = "Min_Value = \ | ([-]? [0-9] * \.? [0-9] *) \ |;" \t $ maxRegex = "Max_Value = \ | ([-]? [0-9] * \.?[0-9] *) \ | 「$ modif = 0 ($ fieldValue의 -match $ minRegex 있으면) {\t \t \t \t \t $ 토큰 = $ 일치 [1] $ 여분 = "= MIN_VALUE | "+ ([변환] :: ToDouble ($ 토큰) * $ 팩터) +"|; " $ fieldValue의 = $ fieldValue의 -replace $ minRegex, $ 교체 \t $ modif = 1 \t \t \t \t \t } // 최대 값을위한 아이디 \t \t \t \t \t \t ($ modif) // UPDATE 쿼리 – Illuna

답변

1

당신은 너무 여기 DBMS를 지정하지 않은 Postgres를 사용하는 솔루션입니다. 적어도 당신은 그 뒤에 논리를 따를 수 :

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; 

을 마법처럼 일 : 입력 문자열에서

  1. regexp_matches와 추출물이 개 정수
  2. 두 개의 행으로 배열을 풀고 사용 unnest
  3. 이 정수 값 (현재 텍스트 임)을 Integer으로 캐스팅하고 계수로 곱합니다. 4 구분 기호로 ;에 44,683,210 사용 string_agg는 처음에 Min_Value=|를 추가 ;
  4. 사용 concat로 구분 두 정수를 포함하는 하나 개의 문자열 행을 만들기 위해, 그래서 문자열 Min_Value=|40;400
  5. 지금 사용 replace이며 다음 부분으로 ; 교체 - |;Max_Value=|을 너무 문자열이 현재 문자열의 끝에 |;를 추가하기 위해 다시 Min_Value=|40|;Max_Value=|400
  6. 사용 concat입니다

입력 :

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

결과 :

Min_Value=|40|;Max_Value=|400|; 
+0

을 당신의 anwser 주셔서 감사합니다 경우 \t \t \t \t \t \t \t , 내 질문은 대상에 대한 자세한로 수정했습니다. – Illuna

+0

기본적으로 게시 한 것으로부터 아무 것도 작동하지 않습니다. 직접 시험해보십시오. 기본적인 정규식 지식은 문제 A를 해결할 것입니다. 그렇다면 기본적인 Powershell 지식은 문제 B를 해결할 것입니다. –

관련 문제