- 締切済み
テキストファイルの置換
テキストファイル"A.TXT"があります。 ファイルの中は項目を「,」(カンマ)で区切られています。 3個目の「,」(カンマ)の後に「日付」が入っていますが、"H21.2.5"や"H21.2.10"となっています。 1桁目は必ず"H"です。(平成の"H") ex. あああああ,AAA,H21.2.5,ああああああ いい,BBBBB,H21.2.10,いいいい この"H21.2.5"を"090205"と置換したいのですが、スキルがないため方法がわかりません。 和暦→西暦下2桁 月→2桁(1桁の時は頭"0") 日→2桁(1桁の時は頭"0") すでにあるファイルを処理するのであれば、Excel読み込み後に置換処理などでなんとかなると思いますが、日次で毎日ファイルが作成されるため、自動的に処理したいのです。 VBSなどのプログラムで一括で処理できないでしょうか。 お力添えをいただければありがたいです。 よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- pita-gora
- ベストアンサー率70% (102/145)
バッチファイルで作ってみました。 ざっと作ったので、a.txtに特殊な記号(<,>,|など)が入っていたり、カンマで区切られた項目に空白が入っていたりするとうまく動かないかもしれません。とりあえず、例示されているテキストファイルでは動作確認しました。 置換した結果はkekka.txtに格納されます。 a.txtを置き換えたいときは、5行目と6行目の:copyと:renの先頭のコロンを取ってください。オリジナルのa.txtをa.bakにリネームして結果をa.txtに格納します。 :---------------------------------------------sample.bat echo off type NUL>kekka.txt for /F "delims=" %%l in (a.txt) do call :sub %%l type kekka.txt :copy /y a.txt a.bak :ren kekka.txt a.txt exit /b :sub set line=%* for /F "tokens=3 delims=, " %%a in ('echo %*') do set before=%%a for /F "tokens=1,2,3 delims=H." %%a in ('echo %before%') do set yg=%%a&set mm=%%b&set dd=%%c set /a yy=(yg+1988) %% 100 set yy=0%yy% set mm=0%mm% set dd=0%dd% set yy=%yy:~-2% set mm=%mm:~-2% set dd=%dd:~-2% set after=%yy%%mm%%dd% call echo %%line:%before%=%after%%%>>kekka.txt goto :EOF
- tatsu99
- ベストアンサー率52% (391/751)
#2です。 以下のようなスクリプトを作成して下さい。 ------------------------------------ while(<>){ @elm = split(/,/,$_); $hdate = $elm[2]; if (substr($hdate,0,1) eq 'H'){ @hymd = split(/\./,$hdate); substr($hymd[0],0,1) = ""; $year = ($hymd[0] + 1988) % 100; $date = sprintf("%02d%02d%02d",$year,$hymd[1],$hymd[2]); $elm[2] = $date; } $line = join(',',@elm); print $line; } ------------------------------------------- これをsample.plの名前で保存します。(ファイル名は任意) コマンドプロンプトで perl sample.pl 入力ファイル名 とすると、変換結果が画面に表示されます。 perl sample.pl 入力ファイル名 > 出力ファイル名 とすると、出力ファイル名に変換結果が格納されます。 以下、入力ファイルと変換結果です。 --------------------------------- あああああ,AAA,H21.2.5,ああああああ いい,BBBBB,H21.2.10,いいいい 噂表,MMM,H1.2.10,表 -------------------------------- あああああ,AAA,090205,ああああああ いい,BBBBB,090210,いいいい 噂表,MMM,890210,表 --------------------------------- もちろん、perlがないと動きませんので、もし、ない場合は perlをインストールしてください。
- SHIMAPEE
- ベストアンサー率75% (154/203)
日付の箇所、例えば下記のような方法はどうでしょうか。 strHDate = "H21.2.5" WScript.Echo strYYMMDD(CDate(Replace(strHDate,".","/"))) Function strYYMMDD(strDate) YY = Right(Year(strDate) ,2) MM = Right("0" & Month(StrDate) ,2) DD = Right("0" & Day(StrDate) ,2) strYYMMDD = YY & MM & DD End Function
- tatsu99
- ベストアンサー率52% (391/751)
perlでもいいなら、サンプルをつくれますが。
- redfox63
- ベストアンサー率71% (1325/1856)
H21.2.5やH21.2.10のままでは上手くいかないでしょう 『.』を『/』に置換して CDateに与えてやれば日付として認識します これを FormatDateTimeで文字列に変換して『/』や余分な20を削除といった手順かと ファイルのOpenには FSO(FileSystemObject)のOpenTextFileで開いて ReadLineで1行取得 Splitで ,ごとの要素を取得 3番目の要素の 『.』を Replaceで置換 CDateで日付型に変換 FormatDateTimeで文字列に 余分な『/』や『20』を削除 Joinで1行に復元 一時ファイルへ保存 ReadLineに戻って処理 元ファイルを閉じてから DeleteFileなどで削除 MoveFileなどで一時ファイルの名前を変更 といった手順でしょう ただしこの方法はWindowsの設定に依存します WinXPなら コントロールパネルの『地域と言語のオプション』の短い形式で表示する日付が 2009/2/4 つまり yyyy/M/dと設定されていると 2009/02/04とはなりません
補足
早々にありがとうございます。 ご指示のような「手順」はわかっているのですが、 スキルが無いので、具体的なコーデイング方法がわかりません。 自分なりにVB関係のWebも調べはしましたが。 そのあたりを教えていただけるとありがたいのですが。
補足
嬉しいお言葉をありがとうございます。 お言葉に甘えさせていただけるのであれば・・・。 よろしくお願いいたします。