• ベストアンサー

windows bat 置換

master.csvの内容 11111,eeeeee,55555 for /f "delims=" %%A in (master.csv) do call :sub1 "%%A" del master.csv ren master6.csv master.csv goto :eof :sub1 set "LINE=%~1" echo %LINE:,=2C%>>master6.csv 以上のようにカンマを2Cに変換し、改行コード(CR)(LF)を0D0Aに変換したいのですが、 どうしたらよいでしょうか? また、同時に実行することは可能でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.4

>・ID_before"の値が "0001010114100DD800" をunhexして、CSVファイルに出力したものをバイナリーエディターで見ると"01010114100DD85C30"となってしまうのです。 自分の環境では、まったく同じにはなりませんでしたが、確かに似たような状態になりますね。 (バイナリ値の前後に \0 が付くんですね) で、正直に申し上げて、これをどうやって回避するかは、自分にはわかりかねます。 何度も言うように、バイナリをこの方法でやり取りするところに無理があるのであって。 CSVにバイナリを入れる事自体がイレギュラーなので、繰り返しになりますが、私なら最初からこうします。 (前の回答の繰り返しです) ↓ SQL文は以下でCSVを作成 SELECT ID_before,CODE_AFTER,NAME_AFTER FROM work1 into outfile "C:/master2.csv" fields terminated by ","; ↓ CSVをバイナリだけ除いて移行先のテーブルにインポート ↓ で、多分「それじゃ移行先でバイナリが入れられないじゃないか」と思われるでしょうが、「だから!」そこは移行した先でバイナリにするんですって! ↓ (例) UPDATE ikou SET ID_after = unhex(ID_before) WHERE ID_after IS NULL; 今、自分の環境でサクッと試してみましたが、何の苦労もなく入れられました。 現在、実装されていると構成が変わるので、手戻りにはなりますが、「CSVにバイナリを入れる」事に拘泥して、この後わんさか出てくる諸問題を考えると、質問者様も上司も顧客もオールハッピーになるには、これしかありません! まあ、ひょっとしたら回避方法を知っている識者がMySQLカテにいるかもしれませんけどね。 そこは、またあちらで聞いてみてはどうでしょうか? >・CSVに出力したものをバイナリーエディターでみると、改行コードが、CrLF  にしたいのですが、LFだけしか表示されません。 こちらは私の環境でもそうなります。 これは mysql.exe の仕様っぽいですね。 ただ、移行先でLFのままでも問題がなければ、それでもOKと思いますけど。 移行先の仕様上、または要件定義上、CRLF以外は許容できないのであれば前の回答で提示したVBScriptを改造して、「LF→CRLF」にファイル丸ごと置換するようなものを作って間に噛ませてやればよいと思います。 (そこはご自身でお願いしますね) >・CSVに出力したものをバイナリーエディターでみると、最後の行に’1A’とバイナリーエディターで表示されてしまうのです。 ああ、失礼。そのSUB(0x1A)ですね。 こちらは、私の環境では再現できなかったですが、想像は付きます。 多分結果のCSVに、COPYコマンドでヘッダー行を付けているのではないですか? その場合は、末尾に0x1Aが付くのはMS-DOS時代からの仕様です。 (ハイ、そこのオジサン連中はニヤニヤしない!w) copy Aファイル + Bファイル 最終ファイル ではなく copy /b Aファイル + Bファイル 最終ファイル とすれば、末尾の0x1Aは消えます。

sn1108
質問者

お礼

utakataXEXさん ありがとうございます。

sn1108
質問者

補足

UPDATE ikou SET ID_after = unhex(ID_before) WHERE ID_after IS NULL; を行うと、一度うまくいあったのですが、SQLを投げる時に、character はしないほうがよいのですかね? ECHO SET character SET sjis;>create0_sql.sql ちなみにUPDATE して格納するテーブルの定義は型は関係ありますか?

その他の回答 (4)

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.5

ささっと要点だけ。 > UPDATE ikou SET ID_after = unhex(ID_before) WHERE ID_after IS NULL; > を行うと、一度うまくいあったのですが、SQLを投げる時に、character はしないほうがよいのですかね? 文字コード関連のSET文は、今回の場合に関しては関係ないです。 日本語の項目があって、それを表示したいならSETすればよいし、英数字しか扱わないのであれば、SETする必要無し。 > ちなみにUPDATE して格納するテーブルの定義は型は関係ありますか? これは関係ありますよ。 バイナリを入れるのだから、それ用の型で定義する必要があります。 因みに私が、この質問に答えるのに作成したテーブルは以下の通りです。 (主キーやリレーションは一切考慮していません) create table work1 ( ID_before varchar(18), CODE_AFTER varchar(10), NAME_AFTER varchar(50) ); create table ikou ( ID_before varchar(18), ID_after varbinary(9), update_date timestamp ); 今回のような小さいバイナリを入れるのであれば、VARBINARYを使用します。 定義する場合は、上記のように VARBINARY(n) で定義するか、VARCHAR(n) CHARACTER SET binary で定義します。 ※IDmの長さは原則的に不変なはずなので、BINARY(n)=CHAR(n) CHARACTER SET binary の方が適当だったかな?

sn1108
質問者

お礼

utakataXEX さん ありがとうございます。

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.3

#1、2 です。 正直、今回の#2の補足質問の内容は、私には理解できません。 >"ID_before"の値が "0001010114100DD800" をunhexすると、"01010114100DD85C30" work1.ID_beforeに入っているのは文字列ですか?バイナリですか? 文字列で 0001010114100DD800 になっているなら、unhexしたら文字列"01010114100DD85C30"にはなり得えません。 (人間には読めない値になります) これがFelicaのIDmだとしたら、何故(Felicaチップにアクセスする時以外にも)バイナリ値でやり取りしないといけないのかが、相変わらずわからないのですが、ええ、そこはいいです。もう私が折れましょうw しかし、折れるに折れられない部分があります。他の回答でも書いた事ですが、 「何で、unhexしたバイナリ値をCSVに入れるのかなぁ?」 バイナリに何が入るかは不定ですよね? たまたまカンマ(と同じASCIIコード)や Cr(と同じASCIIコード)や Lf(と同じASCIIコード)が入っていたらどうなります? その事の可否はフェリカネットワークスやソニーが決める事であって、私達使用する側ではどうあっても制御できませんよね。 「たまたまお客様のIDmには制御文字が含まれておりますので、取り込めませんでした。お諦めください」 って言いますか? 「何故バイナリの先頭と末尾が変わったか?」について、はっきりと特定はできませんが、バイナリとテキストが混在したCSVからバイナリだけ抜いて、移行先に上手い事、格納するなんて、普通の mysql.exe や他のクライアントツールではそもそもが無理ですよ。 うまく行く事もあるでしょうが、うまく行かなかった時にリカバリーする方法がありません。 どうしても、それが必要なら C言語 か何かでクライアントツールを作るしかありません。 で、とにかく私がお薦めする、ソリューションとしてはですね。繰り返しになりますが。 「CSVにバイナリを入れるのは諦める」 これしかありません。 バイナリを扱いたい、と言うのは、ええ、くどいけど折れますよ。 でもCSV渡しで、確実にバイナリ値を移行したいなら、HEXした文字列で渡すしかありませんよ、普通。 【移行元DB】 IDmがHEX表記の文字列で格納されている(で合ってますよね?) ↓ CSVに『unhexせず』そのまま格納(ここが重要!) ↓ 【移行先DB】 IDmは文字列とバイナリ両方のカラムを持っている(でいいのかな?) ↓ 文字列のカラムはそのままインポートなりインサートなり、すればよい ↓ バイナリのカラムの方は(ここで初めて)unhexしたものを入れればよい 例えば update kekka_table set idm_bin = unhex(idm_mojiretu) where idm_bin is null とかね。 あ、これが20バイト足らずなので、上記のように書いていますが、バイナリの大きさが数MB~GBクラスになったら、さすがにそんな事はしませんよ。 その場合は、LOB(ラージバイナリオブジェクト)になるので、そもそも扱いが違います。 >また、改行コードが、CrLF  にしたいのですが、LFだけしか認識しません。 どこの改行コード?認識しないとは誰(何)が? >最後にSUBが入ってしまいます。 何の最後に?CSVの最後に"SUB"と言う文字列が入る、と言う事ですか? 最後はちょっと苦言。 >確認したところ、上記の変換はしなくてよかったのですが、 むむむ。 「本当にこれで要件満たせるの?」と念押しした上での#2の回答だったんですけど。。。 失礼を承知で言ってしまいますが、少し「泥縄」と言うか「後手後手」過ぎませんか? #1 で書いた、「わざわざ物凄く遠回りなシステム構成/実装」と感じる部分が、質問者様ご自身に起因するものなのか、上司やお客さんの無茶ぶりによるものなのか、私には知る由もありませんが、多分、このままだと長大な質問ツリーがシステムリリースまで(リリース後の運用フェーズでも)続くような気がします。 確実に言える事は、バイナリやキャラクタセットについての扱いを質問者様ご自身があまり理解されていないようで、そのために質問や、実装方法も、なんとなくトンチンカンなものになってしまっているようです。 ともあれ、乗りかかった船。もうここまで来たら、できる限りの回答はしますので、補足をお願いします。 (私自身の業務に支障を来たさない範囲でですがwww)

sn1108
質問者

お礼

utakataXEX さん 有難うございます。

sn1108
質問者

補足

・ID_before"の値が "0001010114100DD800" をunhexして、CSVファイルに出力したものをバイナリーエディターで見ると"01010114100DD85C30"となってしまうのです。 ・CSVに出力したものをバイナリーエディターでみると、改行コードが、CrLF  にしたいのですが、LFだけしか表示されません。 ・CSVに出力したものをバイナリーエディターでみると、最後の行に’1A’とバイナリーエディターで表示されてしまうのです。

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.2

#1 です。 > インストールできない環境なので、 > BATからVBScriptで処理するには、どうしたらよいのでしょうか? この補足があると言う事は、やりたい事はこれで間違いない、と言う事ですね。 (何か釈然としないけど、まあ、そこまで私がどうこう言える立場でもないので。。。) 実装に手間のかからない方法で書きます。 パスやターゲットの文字列等は引数にして汎用的に作る事も可能ですが、固定にします。 (自分が面倒臭いだけw) まず、以下のVBScriptを replace_crlf.vbs として保存してください。 ここから↓↓↓↓ Const ForReading = 1, ForWriting = 2, ForAppending = 8 Dim vbCrLF Dim fso, f Dim ifile Dim strBuf ' 改行変数 vbCrLF = chr(13) & chr(10) ' ファイル名 ifile = "master.csv" ' ファイルオープン Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile(ifile, ForReading) ' ファイルの内容をReadAllで変数に格納 strBuf = f.ReadAll() ' ファイルクローズ f.Close ' カンマを"2C"に置換+CRLFを"0D0A"に置換(ファイル丸ごと) strBuf = Replace(strBuf, ",", "2C") strBuf = Replace(strBuf, vbCrLF, "0D0A") ' 結果表示 WScript.Echo strBuf ここまで↑↑↑↑ ReadAll で丸ごと取得した変数を丸ごと2回置換し、標準出力に一気に吐き出す、と言う超手抜き版です。 CSVの件数がかなり多い(または横列が長大の)場合は結構時間がかかります。 (1)エラー等の取り回しを考えても、Readline で1行ずつ処理した方がいいでしょう。 (2)結果としては改行の無い長大な1行データになりますが、この構成で横列が何バイトまで出力可能なのかは、私にもわかりません。 Echoのリダイレクトではなく、出力ファイルを定義して改行無しのWriteで追記していく方が確実です。 (3)最初に書いたとおり汎用的なパラメータ取得にはしていません。 上記3点はご自身の自助努力でお願いします。 上記VBSを使って、前の回答で使ったバッチを少し弄って、こんな感じにします。 @echo off REM FOR文使わず楽ちんバージョン(VBS版) REM カンマを"2C"に置換+CRLFを"0D0A"に置換(ファイル丸ごと) call cscript //nologo replace_crlf.vbs > master6.csv del master.csv ren master6.csv master.csv それと、重要な事を書き忘れましたが、今書かれているバッチは、パスを意識した作りになっていませんよね。 これも老婆心から補足しておきます。 本番への適用が初回の1回~数回だけの移行処理で、実行も手動でするなら、このままで問題ありません。 しかし、もし、タスクスケジューラで毎日定期的に起動するのであれば、このままでは実行時にエラーになるので、使用するコマンド(DOSコマンドは除外)やファイル名はフルパスで記述するようにしてください。 (システムパスが通っている場合でもそうするのがセオリーです) これは、Unix/Linuxなどで cron で処理する場合も同様です。 でも。。。やっぱり構成や基本設計から見直した方がいいんじゃないかなぁ。 ここの識者の皆さんも(わざわざ言わないだけで)同意見だと思うけど。 あの(CSVではない)CSVファイルをどうやって運用していくつもりなのか、気になる。。。

sn1108
質問者

お礼

utakataXEX さん ありがとうございます。

sn1108
質問者

補足

何度もすみません。 確認したところ、上記の変換はしなくてよかったのですが、 以下のSQLを発行してCSVに出力するのですが、 DBに格納されている"ID_before"の値が "0001010114100DD800" をunhexすると、"01010114100DD85C30" と変換されてしまうのですが、どうしてでしょうか? また、改行コードが、CrLF  にしたいのですが、LFだけしか認識しません。 あた、最後にSUBが入ってしまいます。 どうしたら、よいでしょうか? SELECT unhex(ID_before),CODE_AFTER,NAME_AFTER FROM work1 into outfile "C:/master2.csv" fields terminated by ",";>>create3_sql.sql

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.1

まず、ご質問の回答としては。 Windows(DOS)のコマンドで、カンマは'2C'に置換できます。 (既に質問者様ご自身で実装されている通りです) しかし、改行(CRLF)は置換できません。 制御文字のすべてがダメかと言うと、微妙にそうでもないんですが、改行については、どうやっても無理です。 findstrの正規表現にも改行を捕捉する術はありません。 VBScript や Windows PowerShell で Replace するとか、jperl や tr(Unixの置換コマンドのDOS移植版)などで、正規表現で改行を捕捉して置換するとかになります。 VBScriptなら何もインストールする必要がなくて済みますが、データが大量だと結構時間がかかるので、個人的には jperl や tr の使用をお薦めします。 (新規にユーティリティ類をインストール可能なら) jperl を使った例で、質問者様のバッチを少し弄ると以下のようになります。 @echo off for /f "delims=" %%A in (master.csv) do call :sub1 "%%A" REM 改行(CRLF)を文字列"0D0A"に置換(ファイル丸ごと) jperl -pe "s/\n/0D0A/g" < master6.csv > master6_tr.csv REM ※リネームファイルを変更した点に注意! del master.csv del master6.csv ren master6_tr.csv master.csv goto :eof :sub1 set "LINE=%~1" echo %LINE:,=2C%>>master6.csv :eof これでご希望の事はできるのですが、こうなってしまうと、むしろ FOR文を使わず、jperlだけを使った方が楽ちんで速い、と言う事になります。 以下を見てわかるとおり、バッチ自体も非常にシンプルになります。 @echo off REM FOR文使わず楽ちんバージョン REM カンマを"2C"に置換+CRLFを"0D0A"に置換(ファイル丸ごと) jperl -pe "s/,/2C/g" < master.csv | jperl -pe "s/\n/0D0A/g" > master6.csv del master.csv ren master6.csv master.csv さて、回答としては以上なのですが、また少しおせっかいな事を書きます。 これで業務要件としては満たせますか? CSVのカンマと改行だけ"2C"と"0D0A"に置換する意味がわからないのです。 因みに、例えば、2行あったら結果は以下のようになります。 1111,aaaaa,あ 2222,bbbbb,い ↓ 11112Caaaaa2Cあ0D0A22222Cbbbbb2Cい0D0A この master.csv を受け取る側は、この内容で何ができるんでしょうか? 既にCSVではなくなっているし、改行も無いので通常のWindowsやLinuxのアプリケーションではあまり使わないフォーマットと言えます。 (しいて言えば、汎用機?それにしたって無理がある) すべてのカラムがHEXになっているなら、まだ何となくわかりますけど。 (いや、何となくですけど) 何かこの、やり取りさせていただいても、「普通なら単純にできる事を、わざわざ物凄く遠回りなシステム構成/実装にしているのではないか?」と受け取れる内容なんですよ。 まあ、「これこそがやりたい事だ」と言われれば大きなお世話なんですが。。。

sn1108
質問者

お礼

utakataXEX さん 有難うございます。

sn1108
質問者

補足

インストールできない環境なので、 BATからVBScriptで処理するには、どうしたらよいのでしょうか?

関連するQ&A

  • windows bat ファイル 置換

    windowsのbatでCSVファイルの内容を文字列置換するには、どうしたらよいでしょうか? master.csvの内容 1111,aaaaa,ああああ このmaster.csvの内容のカンマを'2C'と改行コード(CR)(LF)を’0D0A’に置換したいです。

  • バッチファイル内置換

    バッチファイルで、置換をしたいのですが、"="と"<"の置換が出来ません。 ping出力を「file.txt」へ保存し、保存した「file.txt」を一行づつ読み出し下記を実行しています。 for /f "delims=" %%a in ( orig ) do ( set line=%%a call :sub ) :sub set tmp=%line% set tmp=%tmp:<=,% set tmp=%tmp:= =,,% set tmp=%tmp:"時間" =,% set tmp=%tmp:ms=,ms% echo %tmp%>>%CSV_Name% goto :EOF :end 置換出来ないのは、"=" と "<"の文字だけが置換出来ません。 ネットで調べたのですが、"^" でエスケープしても、""二重引用部でくくっても、正しく置換でき有ません。

  • フォルダー内の複数ファイル名を一括で変名するbat

    フォルダー内の複数ファイル名を一括で変名するbatを教えてください。 batは、デスクトップに配置して 処理するフォルダーをD&Dして処理させる形式をとしたいです。 以下のような形式です。  No1 aaaa bbbb [com : *********].zip を  No1 aaaa bbbb.zip に変名する。   (*******は任意の文字列) 例えば、 No1 aaaa bbbb [com : taken2110221100014].zip であれば No1 aaaa bbbb.zip に変名する。 以下が参考になりそうなので https://oshiete.goo.ne.jp/qa/9263608.html 記事中の助言を元に以下のようにコードを修正してみましたが うまく処理できませんでした。 bat(test,bat,test2.bat)のどこを再修正すれば希望の処理ができますか ? 希望は、下記ですが 「batは、デスクトップに配置して 処理するフォルダーをD&Dして処理させる形式をとしたいです。」 batを修正してもこのbatでは、D&Dで処理することは可能で無い場合は アドバイス又は他の参考なりそうなURLを紹介ください。 '------------------------------------------ rem test.bat echo off for /F "delims=" %%f in ('dir /*.mp4') do call :sub "%%f" exit /*.mp4 :sub set fname=%~1 set n=0 :loop call set c=%%fname:~%n%,1%% set /a n=n+1 if "%c%"=="" goto :EOF if "%c%"=="[com" goto break goto loop :break set /a n=n-1 set ext=%~x1 call set newname=%%fname:~0,%n%%% call set newname=%newname%%ext% if "%newname%"=="" goto :EOF if "%newname:~0,1%"=="." goto :EOF ren "%fname%" "%newname%" goto :EOF '-------------------------------------- rem bat2.bat for /F "tokens=1* delims=[com" %%F in ('dir /b *.mp4') do echo move %%F[com%%G %%F.mp4 '--------------------------------------

  • バッチファイルでの%を含むファイル名の取得

    以下はEドライブを走査してフォルダごとのjpgやpngなどのファイルの数を全て表示するバッチ処理ですが。基本的に上手く動きますが%を含むファイル名、フォルダ名に当たると上手く動きません。どうしたらいいでしょうか?”ファイル名、フォルダ名に%を使うな”という回答以外でお願いします。 @echo off pushd E:\ for /f "delims=" %%j in ('dir /b /s /a:d') do call :sub "%%j" exit /b :sub echo /////////////////////////////////////////////////////////////////////////// for /f "delims=" %%x in ('dir /b %1 ^| find /c ".jpg"') do call :jpg %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".JPG"') do call :jpg2 %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".png"') do call :png %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".bmp"') do call :bmp %%x echo %1 echo jpg %jpg_c% echo png %png_c% echo bmp %bmp_c% echo JPG %jpg2_c% goto :EOF :jpg set jpg_c=%1 :echo %1 goto:EOF :jpg2 set jpg2_c=%1 :echo %1 goto:EOF :png set png_c=%1 :echo %1 goto:EOF :bmp set bmp_c=%1 :echo %1 goto:EOF :all set all_c=%1 :echo %1 goto:EOF

  • DOSバッチでUNIXテキストファイルの文字列置換

    お世話になります。 早速ですが、 「DOSバッチでテキストファイルの文字列置換を行うプログラム」がいろいろ紹介されていたので、 皆さんのプログラムを流用させていただき、勝手に継ぎ足したDOSバッチプログラムを以下の ように作りました。 このDOSバッチで置換されたテキストファイルに2つの問題が発生して困っています。 問題 1)UNIXテキストファイルの改行コードがLFからCR+LFに変ってしまう。     文字列置換した後にファイルサイズが大きくなっていたので発見しました。      問題 2)空白行がなくなる。     DOSプログラムでは、対応不可でしょうか?     やはり、sed,awk,WHS,power shell を使わないと解決しませんか? -(DOSプログラム f0.bat)------------------------------------------------------ ::** @echo off setlocal ENABLEDELAYEDEXPANSION set fname=%1 copy /b %fname% org >nul type nul >%fname% for /f "delims=" %%a in (org) do (set line=%%a&&set l=!line:abc=xxx!&&echo !l!>>%fname%) del org goto end :end exit /b 0 -(実行時の標準出力結果 list)----------------------------------------------- C:\>setlocal ENABLEDELAYEDEXPANSION C:\>set fname=t22.txt C:\>copy /b t22.txt org 1>nul C:\>type nul 1>t22.txt C:\>for /F "delims=" %a in (org) do (set line=%a && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=J0000000 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=HHH && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=519 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=2011-08-28 12:16:44.98302 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=2011-08-28 12:16:44.016114 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=0 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=abc && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>del org C:\>goto end C:\>exit /b 0 --(置換前 t22.org LF改行コード)-------------- J0000000 HHH 519 2011-08-28 12:16:44.98302 2011-08-28 12:16:44.016114 0 abc --(置換後 t22.txt CR+LF改行コード)----------- J0000000 HHH 519 2011-08-28 12:16:44.98302 2011-08-28 12:16:44.016114 0 xxxx ------------------------------------------ 皆さんのご意見、ご指導をお待ちしてます。

  • DOSのバッチで、テキストファイル中の文字を置換したい

    いつもお世話になっております。 WindwsXPでDOSバッチを使ってテキストファイル中にある文字列1を文字列2に置換したいのです。 ネットをさまよっていて、こんな例を見つけました。 (参考にしたのはここです。http://www.fpcu.jp/dosvcmd/bbs/log/cat3/cat54/2-0391.html) ====================== @echo off if "%1"=="" goto end set fname=%1 copy %fname% org >nul type nul >%fname% for /f "tokens=1* delims=" %%a in ( org ) do (set line=%%a&& call :sub) del org goto end :sub :この1行下の acb=xyz に置換前と置換後の文字列を指定する。 set l=%line:abc=xyz% echo %l%>>%fname% goto :EOF :end ====================== これをsample.batという名前で保存し、DOSのウィンドウでsample < a.txt と打つと、a.txtファイル中の"abc"が"xyz"に置き換わります。 これに手を入れて置換前と置換後の文字列を可変にしたく思い、sub中に set mae=abc set ato=xyz の2行を加え、変数に値を設定するようにしました。 ところが、次の1行の書き変え方がわかりません。 set l=%line:abc=xyz% を set l=%line:%abc%=%xyz%% のように変えてみましたが、うまく動きません。 どなたかご教授いただけませんか。DOSだけでファイル中の文字列の置換ができればset文を使う使わないにはこだわりません。

  • こちらのバッチファイルの改修をお願いしたいです。

    過去に別のIDで質問したのですがパス紛失してしまったので・・・ http://okwave.jp/qa/q6858298.html?&status=true&errcode=&msg=&qid=6858298 改修の内容としては下記2点になります。 【○○】 [△△] □□.txt (1)○○や△△の部分にドット等の記号があるとそのファイルはスルーしてしまうので、スルーせずに動くように。 (2)もし、同じファイル名があったら上書きせずに「C:\被り」のフォルダに振り分ける。 どなたかお手すきでしたらよろしくお願い致します。 ----------- echo off set from=C:\振り分け set to=C:\整理済 for /f "delims=" %%a in ( 'dir /b "%from%\*.txt"' ) do call :sub "%%a" echo 振り分け終了しました exit /b :sub for /f "tokens=1 delims=]" %%f in ( "%~n1" ) do set findname=%%f] :FolderA if exist "%to%\A\%findname%*" move "%from%\%~nx1" "%to%\A\"&&goto :EOF :FolderB if exist "%to%\B\%findname%*" move "%from%\%~nx1" "%to%\B\"&&goto :EOF :FolderC if exist "%to%\C\%findname%*" move "%from%\%~nx1" "%to%\C\" goto :EOF

  • windows batの一部分を繰り返し実行したい

    以下の部分を繰り返しbatで実行したいのですが、どうすればよいでしょうか? REM 取得したい行数-1を指定 FOR /F "tokens=1-9 skip=%LINE%" %%i in (dakoku_data.csv) DO ( SET B=%%i%%j%%k%%l%%m%%n%%o%%p%%q ECHO %%i%%j%%k%%l%%m%%n%%o%%p%%q>>insert.txt GOTO EXIT_FOR ) :EXIT_FOR ECHO %B% FOR /F "tokens=7-9 delims=," %%i in (insert.txt) DO set RR=%%i%%j if %RR%==000 FOR /F "tokens=1-3 delims=," %%i in (insert.txt) DO set C=20%%i-%%j-%%k if %RR%==000 FOR /F "tokens=4-5 delims=," %%l in (insert.txt) DO set D=%%l:%%m:00 if %RR%==000 FOR /F "tokens=6 delims=," %%i in (insert.txt) DO set E=%%i REM MySQL PATH set PATH="C:\Program Files\MySQL\MySQL Server 5.0\bin" REM CHARACTER ECHO set character set sjis;>__sql.sql REM if %RR%==000 ECHO INSERT INTO `XXX` VALUES ('%E%','2011-11-15 14:33:19', '%C%', '0', '%C%', '%D%', , '8',null, null, , '8', '1', '1', null, '', null);>>__sql.sql

  • forコマンドのdelimsオプションで「","」を指定したい

    以下のような データにコンマが含まれる(単価の項目)CSVファイルから 特定の列を抽出したCSVファイルを作ります。 "顧客ID","住所(送先)","商品ID","商品名","単価","数量","出荷日", "001","○○市○○町○○","202","□□","1,500","10","2009/7/7" "顧客ID","住所(送先)","商品ID","商品名","単価","数量","出荷日", "002","○○市○○町△△","503","◎◎","1,980","5","2009/7/6" 現在は以下のようなバッチファイルで対応しています。 @echo off :顧客ごとのヘッダ情報の行を削除 type syukjnminohyo.csv | find /v "顧客" > temp1.txt :ファイルデータを環境変数に代入し :subでデータの区切りである「","」をタブに変換 for /f "tokens=1,* delims=" %%a in (temp1.txt) do ( set line=%%a call :sub ) :タブを区切りとして特定の列を抽出 for /f "tokens=1,2,5,6 delims= " %%a in (temp2.txt) do ( @echo "%%a","%%b","%%c","%%d" >> out.txt ) :sub set line=%line:","= % echo %line:"=% >> temp2.txt 途中でファイルも作られるなど エレガントでない部分が多いため 皆様のお力をお貸し頂きたく質問いたしました。 よろしくお願いします。

  • 以下のtest.batでtest.txt中のダブルコーテションを削除し

    以下のtest.batでtest.txt中のダブルコーテションを削除したいと考えています。 【test.bat】 @echo off if "%1"=="" goto end set fname=%1 copy %fname% org >nul type nul >%fname% for /f %%a in ( org ) do (set line=%%a&& call :sub) del org goto end :sub set l=%line:"=% echo %l%>>%fname% goto :EOF :end 【test.txt】 "test1",101,1 "test2",201,2 "test3",301,3 dos窓からtest.bat test.txtを実行し、test.txt の内容を確認すると、 test1,101, という結果になります。 なぜ、最後の数字が削除されるのか? 2行目、3行目のデータが無くなるのは? というところがわかりません。 単純にダブルコーテーションを削除するにはどうしたらよいでしょうか? よろしくおねがいします。