質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

3回答

15068閲覧

バッチファイルを使用して、テキストファイルの文字列置換処理

durasama

総合スコア18

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

1クリップ

投稿2019/02/22 07:58

編集2019/02/22 08:37

前提・実現したいこと

バッチファイル(.bat)でのfor文の中での文字列置換を行う際
CSVファイルの後ろから16文字取得し、
9文字目と10文字目の間にスペースを入れる処理を行いたいです
置換前) "abcdefghijklmn"
置換後) "abcdefgh ijklmn"

そして可能であれば、以下のnew.csvに書き込むのではなく
old.csvで直接文字列を探して置換できるようにしたいと思っています。

該当のソースコード

bat

1@echo off 2SETLOCAL enabledelayedexpansion 3 4set filepath=C:\hoge\old.csv 5 6for /f %%d in (%filepath%) do ( 7 set line=%%d 8 set before=!line:~-16! 9 set after=!line:~-16,9! !line:~-7! 10 11 echo !line:%before%=%after%! >> new.csv

試したこと

現状、上記コードでバッチを実行するとnew.csvline:= という文字がfor文の回数入るだけでした
遅延環境変数の問題かと思い、
beforeafter%before%じゃなく!before!にしたりも試しましたが
結果はbeforeafterと入力されるだけでした

もう一つ試したこととして片方だけ環境変数では文字列

echo !line:"abcdefghijklmn"=%after%! >> new.csv

こちらと!after!で試してみましたが
%%だと文字列が消えて!!だとafterという文字列が入力されました

バッチファイル作成は初めてで至らないところが多いですが知恵をお貸しいただければ幸いです。

補足情報(FW/ツールのバージョンなど)

Windows10
PostgreSQL11

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/02/22 08:37 編集

PostgreSQL直接関係ないじゃん、質問タグから外してね。それと、コマンドプロンプトって質問タグを追加するべき。
durasama

2019/02/22 08:37

仰る通り直接関係はないのでタグ付けする必要はありませんでした。 申し訳ございません。
退会済みユーザー

退会済みユーザー

2019/02/22 08:49

そこまでかしこまらなくていいよ。(個人的にはこういう案件だとすぐPHPとかPerlとかやり慣れてる言語でやっちゃうので、お力になれず。)
durasama

2019/02/25 00:55

質問の追記が遅くなって申し訳ございません。 現在、`before`と`after`にはスペース無し、スペース有りの入れるべき情報が入っているので それをどのようにして`line`の中で`before`を探し出して`after`に置き換えるか、という部分で 詰まっております。
durasama

2019/02/25 01:02

現状、置換の部分を echo !line:!!before!!=!!after! >> new.csv としているのですが、バッチを実行するとnew.csvに "abcdefghijklmn""abcdefgh ijklmn" という文字列が表示されるという状態です。
guest

回答3

0

ベストアンサー

提示されたコードを見て混乱していますが、質問文を正とすると、old.csvのある1行がabcdefghijklmnとして、それに対応するnew.csvの行は`abcdefgh ijklmn'となっていればいいんですよね?

だとすると、バッチ特有の面倒さはいろいろあるものの、難しく考えすぎのような気がします。
9文字より短い場合どうするかとか考えなければ、for文の内側はこれだけで良いです。

BAT

1rem 加工用に1行取得 2set line=%%d 3rem 最後の16文字 4set line=!line:~-16! 5 6rem 取得した16文字の先頭9文字+空白+続きの7文字 7echo !line:~0,8! !line:~9,7!>>new.csv

結果をnew.csvではなく、old.csvへ直接書き戻すのは厳しいので、処理後にリネームまたはコピーするのが落としどころだと思います。エラー処理を考えなければこうでしょうか。

BAT

1rem 元ファイルを待避 2rename old.csv old.bak 3 4rem 新ファイルを元ファイル名にリネーム 5rename new.csv old.csv

old.csvが不要ならば、deleteでも良いと思います。

投稿2019/02/22 11:27

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

durasama

2019/02/25 00:56 編集

お忙しいところ回答ありがとうございます。 遅くなってしまい申し訳ございません。 質問の説明不足でした。。。 old.csvにはほかのデータも入っているため上記のアルファベット文字列だけを切り取るのではなく 全行の最後にアルファベット文字列があるのでそこから9文字目と10文字目の間にスペースを入れたいと思っております。 なので、アルファベット文字列を抽出して書き出すというよりは old.csvの中の行末にあるアルファベット文字列を探して スペースを含めた状態の物と文字列置換したいというイメージです。 説明不足でお手数をお掛けして申し訳ございません。
aki.aki.

2019/02/25 01:46

>old.csvの中の行末にあるアルファベット文字列を探して > スペースを含めた状態の物と文字列置換したいというイメージです。 これ、具体的に3行ぐらいでいいですので、前と後を提示出来ませんか?
durasama

2019/02/25 01:52

aki.aki様 "1","28234235","abcdefghijklmn" "1","284532","abcdefghijklmn" "1","23456","abcdefghijklmn" このようなCSVファイルになっております。 前にあるデータは文字数が変わってき、行末には必ずこのアルファベット文字列が入るため 後ろから文字数を数える処理にしております。
aki.aki.

2019/02/25 09:18

durasamaさん 解決できたようで良かったですね。なるほど、やっとやりたいことがわかりました。私も勉強させて頂きました。ありがとうございました。
guest

0

dos

1@echo off 2rem 9桁目のあとにスペースを入れる。 3for /f %%d in (old.csv) do ( 4 set e=%%d 5 set line=%e:~0,9% %e:~9,16% 6 echo %line%>>new.csv 7)

割と、バッチは好きです。(が、良くわからないところもあるのですが。)
パスを変数にしてらっしゃますが、そこは省略しました。

時間の関係もあり、説明は省略させて下さい。

投稿2019/02/22 11:05

aki.aki.

総合スコア58

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/02/22 11:50

提示されたコードでは、遅延展開もcallも使っていないですが、行毎の繰り返し処理は正しく動作しますか?全行同じ結果になってしまうのでは。 バッチファイルは、たいしたことが出来ない中で何とかする感が、大昔のプログラム環境っぽくもあり、嫌いではないどころか好きな方だと思いますが、積極的に使いたいかというと、とってつけた感のある仕様がなんとも…。
guest

0

皆様、お忙しいところ時間を割いて回答を頂き、誠にありがとうございます。

たったいま、この質問内容に対する問題が解決しましたので記述させていただきます。

for /f %%d in (%filepath%) do ( set line=%%d set before=!line:~-16! set after=!line:~-16,9! !line:~-7! call set line1=%%line:!before!=!after!%% echo !line1!>>new.csv

と、いった風に修正することにより行おうとしていた結果がnew.csvに記入され
ファイルが生成されました。

色々な知恵をお貸しいただいてありがとうございました。

投稿2019/02/25 02:05

durasama

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問