- 締切済み
csvデータの置換について
お世話になります。 batファイルを利用してcsvファイルの数値の置換をしたのですが、ご教授下さい。 詳細は下記になります。 【環境】 Windows2008 Server 【対象ファイル】 test.csv 【実施内容】 ファイルの内容は下記になります。 A,111,aaa B,222,bbb C,333,ccc D,444,ddd E,555,eee 上記の内容で数値を下記のように置換したい。 111は111F 222は222G 333は333H 444は444I 555は555J よろしくお願い致します。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- yaihakiseru(@yaihakiseru)
- ベストアンサー率50% (1/2)
ジミー 「助けてくれよマイケル~」 マイケル「おやおやどうしたんだいジミー? 地味な顔がますます地味になってるぜ?」 ジミー「バッチを使ってcsvを置換したいんだ~」 マイケル「それは大変DA★ そんな時はこのバッチを使うんだ!」 ――――――――――――――ここから――――――――――――――― @echo off setlocal enabledelayedexpansion rem 取得ファイルと出力ファイル名のフルパス set inFile=%~dp0test.csv set outFile=%~dp0test_out.csv rem 出力ファイルの初期化 type nul>"%outFile%" rem 置換一覧取得(このバッチの「rem 一覧,」以降をリストとして使用 set listReadFlag=False set /a cnt=0 for /f "usebackq tokens=1,2* delims=," %%f in ("%~dpnx0") do ( set line=%%f if "!listReadFlag!"=="True" ( set /a cnt+=1 set b[!cnt!]=%%f set a[!cnt!]=%%g ) if "rem 一覧"=="!line!" (set listReadFlag=True) ) set line= rem csvを一行ずつ取り出して置換 for /f "usebackq delims=" %%h in ("%inFile%") do ( set line=%%h rem 置換メソッドで置換して出力 call :Sub echo !line!>>"%outFile%" echo ----- ) pause exit :Sub echo :!line! for /l %%i in (1,1,%cnt%) do ( rem b(before)をa(after)に置換 call echo %%line:!b[%%i]!=!a[%%i]!%% call set line=%%line:!b[%%i]!=!a[%%i]!%% ) echo :!line! exit /b rem バッチ処理時に使う半角記号は使えないので注意 rem 上記やその他で何かあればyaihakiseruまで相談を♪ rem 一覧, 111,111F 222,222G 333,333H 444,444I 555,555J ――――――――――――――ここまで――――――――――――――― ジミー 「Oh! なんだいこのエクセレントなバッチは!」 マイケル「test.csvと同じ場所にバッチを置いてダブルクリックすれば、あら不思議!」 マイケル「bat内に保存されたリストに従ってcsvの内容を置換してくれるスグレモノだ!」 ジミー 「Oh! そいつは便利だぜ!」 マイケル「さらに今後置換対象が増えても大丈夫!」 マイケル「バッチの最後尾に「置換前,置換後」と追加するだけで置換してくれるぜ! ジミー 「Oh! そいつはクールだぜ!」 マイケル「もし分からないことがあったら返信してくれよな!!」 なんだこれ……以上
- imogasi
- ベストアンサー率27% (4737/17069)
>batファイルを利用して どういう言語やスクリプトを使うことを望んでいるのですか。 UNIX系のソフトやコマンドなどを使うのですか。 バッチファイルを操れるレベルなら、テキストエディタの置換などのできるものを探したり、正規表現などを使えるのでは。 ーー わたしはそちらは判らないので,WIN系のメモ帳のテキストファイルを対象に、VBAやVBSCRIPTでやってみた。 例データ aaa,111,2 bbb,222,123 ccc,333,rtw aaa,444,345 drt,666,tyu ーー 標準モジュールに Sub test02() Open "C:\Users\xxx\Desktop\テストデータ3.txt" For Input As #1 'CSVの場合は要修正 Open "C:\Users\xxx\Desktop\テストデータ4.txt" For Output As #2 '-- While Not EOF(1) Line Input #1, x b = Split(x, ",") MsgBox Right(b(1), 1) Z = Chr(Asc(Right(b(1), 1)) + 48) ’1とaには文字コードで48の差があるので ’1とAには文字コードで16の差 この大文字にする場合は+16にする b(1) = b(1) & Z MsgBox b(0) s = "" For i = 0 To UBound(b) s = s & b(i) & "," Next i MsgBox Left(s, Len(s) - 1) Print #2, Left(s, Len(s) - 1) Wend '-- Close #1 Close #2 End Sub Msgbox はテスト以外ではコメント化すること。 結果 aaa,111a,2 bbb,222b,123 ccc,333c,rtw aaa,444d,345 drt,666f,tyu
置換ルールがわかりにくいです。以下、疑問点を挙げますのでご説明ください。 (疑問) 111 は常に 111F に置換されるのか? どんな場合でも 111 は 111F に置換するのか。その場合、111 が 1 件目になくても 111F になるし、複数回出現してもすべて 111F に置換される。それでいいのか。 とりあえずこれだけご説明願います。内容によってはさらにお聞きするかもしれません。 なお、常に 111 が 111F になるのであれば、#2 さんの回答で十分だと思います。
- shintaro-2
- ベストアンサー率36% (2266/6245)
batファイルではなく エクセルやメモ帳でやった方が簡単だと思いますが?
- mpascal
- ベストアンサー率21% (1136/5195)
私は、簡単なテキストデータ処理には、awk (gawk) をつかいます。 https://hydrocul.github.io/wiki/commands/awk.html gawk http://www.vector.co.jp/soft/dos/util/se020845.html