|
いつもお世話になっております。 ある備考に1週間から2週間先の完工日予定が年なしで、「月/日」で入力されていまして、 年を足して、6桁の年月日に直して出力したく作成してみました。 12月は当然、翌年の月日が入力されているので結構、複雑になりました。 正規表現の部分も2つに分かれてしまいました。 自分としては精一杯なんですが、こんなものでしょうか? ご教授頂ければ、幸いです。
備考 = "1/1工事予定" // "7/8予定" "7/9完工予定" print f月日を見つけて取り出す(備考)
FUNCTION f年日を見つけて取り出す(var 備考) G今日 = gettime() 今年 = G_TIME_YY2 備考 = STRCONV(備考,SC_HALFWIDTH)// 半角文字 正規 = CREATEOLEOBJ("VBScript.RegExp") DIM パターン[] = "([1-9]|1[012])/([12][0-9]|3[01])","([1-9]|1[012])/([1-9]|[12][0-9]|3[01])" FOR i = 0 to length(パターン[]) - 1 正規.Pattern = パターン[i] 切出 = 正規.Execute(備考) ifb 切出.count > 0 then DIM 月 = 切出.item(0).Submatches.item(0) DIM 日 = 切出.item(0).Submatches.item(1) 月 = REPLACE(FORMAT(val(月),2)," ", "0") // 2桁の文字列に変換 日 = REPLACE(FORMAT(val(日),2)," ", "0") // 2桁の文字列に変換 年月日 = 今年 + 月 + 日 G完工日 = gettime(0,"20"+年月日) ifb G今日 > G完工日 then Result = val(val(今年)+1)+月 + 日 else Result = 年月日 endif break endif next fend
|
No.5452 2018/07/01(Sun) 00:56:13
|
☆ Re: 月日を見つけて年月日に変換する / siguma |
|
|
> DIM パターン[] = "([1-9]|1[012])/([12][0-9]|3[01])","([1-9]|1[012])/([1-9]|[12][0-9]|3[01])"
で2つに分けてる理由がよく分からなかったのですが?(後ろのだけでいいような?)
とりあえず私はシンプルな形で実装してみました
さらに ・取り出しだけでなく備考自体も書き換える親切設計 ・手抜きの日付チェック機能付き
のおまけ付き(笑)
備考 = "1/1工事予定" //備考 = "7/8予定" //備考 = "7/9完工予定" //備考 = "1/1工事予定 7/9完工予定" // ← 2つ以上あるようなのはダメ" //備考 = "1工事予定" // ← 無視 //備考 = "12/32完工予定" // ← エラー。入力した人を見つけて叱って下さい print f月日を見つけて取り出す(備考) print 備考
Function f月日を見つけて取り出す(var 備考) G今日 = GetTime() 今年 = G_TIME_YY 来年 = Val(今年) + 1 備考 = StrConv(備考, SC_HALFWIDTH) // 半角文字 正規 = CreateOleObj("VBScript.RegExp") 正規.Global = True パターン = "(\d+)/(\d+)" 正規.Pattern = パターン 切出 = 正規.Execute(備考) ifb 切出.count = 0 then MsgBox("日付がない") exitexit elseif 切出.count > 1 then MsgBox("日付が2つ以上ある") exitexit endif md = Replace(Format(Val(切出.item(0).Submatches.item(0)), 2), " ", "0") + Replace(Format(Val(切出.item(0).Submatches.item(1)), 2), " ", "0") try ifb GetTime(0, 今年 + md) < GetTime() then ymd = 来年 + md else ymd = 今年 + md endif except MsgBox("日付がおかしい") exitexit endtry ymd = Copy(ymd, 3) // ex. 20180702 → 180702 備考 = Replace(備考, 切出.item(0).value, ymd) Result = ymd Fend
別に仕事でもないのにここまで作り込むのは個人的にはあまりしたくないことですが、さっさと下に流してしまいたいスレがあるものでつい…(笑)
|
No.5462 2018/07/02(Mon) 03:47:58
|
|
☆ Re: 月日を見つけて年月日に変換する / satocha |
|
|
powershellの柔軟な型変換と.netのdatetime構造体の機能を利用すれば、正規表現周りの難しいことは考えずに済みます。powershell呼び出しのオーバーヘッドが難点ではありますが。 「予定」ということなので、算出された日付が過去なら1年足す処理を入れています。 ※追加 powershell部分に注釈を入れました。
dim 備考リスト[]="1/1工事予定" , "7/8予定" ,"7/9完工予定","3月2日まで" for 備考 in 備考リスト msgbox( f月日を見つけて取り出す(備考) ) next exitexit
function f月日を見つけて取り出す(備考) result=powershell( replace( src, "<STRING>",STRCONV(備考,SC_HALFWIDTH)) ) textblock src try{ #年月日らしき部分を文字列から切り出し、一気にdatetimeオブジェクトにしてしまう。 $day=[datetime]("<STRING>" -replace "([\d/年月日]+).*",'$1') #得られた年月日が過去の日付なら1年を足す if ( $day.compareto((get-date)) -lt 0 ){ $day=$day.addyears(1) } #datetimeオブジェクトから年、月、日の文字列を取り出す。ゼロで左埋めも行う。 $yyyy=$day.year $mm=([string]$day.month).padleft(2,"0") $dd=([string]$day.day).padleft(2,"0") #年月日変数をまとめて出力 "$yyyy$mm$dd" }catch{ #datetimeオブジェクトへの変換が失敗したときは元の文字列を返す "<STRING>" } endtextblock fend
|
No.5463 2018/07/02(Mon) 06:51:18
|
|
☆ Re: 月日を見つけて年月日に変換する / SEN |
|
|
siguma様・satocha様 じっくり調べて、やってみます。 ありがとうございました。
|
No.5485 2018/07/04(Wed) 21:17:00
|
|
☆ Re: 月日を見つけて年月日に変換する / しろまさ |
|
|
// こういう健全な質問ならスッと答えるのにね。
MsgBox( Chk("1/2工事予定") +" "+ Chk("7/8予定") +" "+ Chk("7/9完工予定") )
Function Chk(md) md = rRep(rRep(StrConv(md, SC_HALFWIDTH), "(^|\D)(\d)(?=\D|$)", "$10$2"), "(\d|/)|.", "$1") GetTime(); Dim yy = G_TIME_YY; If G_TIME_MM2+"/"+G_TIME_DD2 > md Then Result = (yy+1)+"/"+md Else Result = yy+"/"+md Result = Copy(Result, 3) FEnd Function rRep(txt, ptn, aft) // 正規表現 置換 Dim r = CreateOLEObj("VBScript.Regexp"); r.Global = TRUE; r.Multiline = TRUE; r.pattern = ptn; Result = r.Replace(txt, aft) FEnd
|
No.5489 2018/07/05(Thu) 10:13:12
|
|