• 締切済み

バッチファイルのFOR文について【tokens~】

お世話になっております バッチファイルの、文字列操作で ---------------------------------------------------------- FOR /F "eol=; tokens=2,32 delims=, " %i in (myfile.csv) do @echo %i %j %k ---------------------------------------------------------- のtokensで指定している32列目(カンマが32個目)以降の値を 取得しません。 なぜでしょうか。 下記のHPを参照すると、一度変数をクリアしそのしたでさらにForで 指定すればよいとのことなのですが、欲しい値が多すぎて とても、Forのしたに何度書きたくありません。 http://folomy.jp/heart/?m=pc&a=page_c_topic_detail&target_c_commu_topic_id=12560 どのようにしたら、目的を果たせるのでしょうか。 ご教授ください。

みんなの回答

  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.3

#1です。追記です。 for文の2重ループで分解する方法の例を載せておきます。 tokens=2,32,33,35 に相当しているところが echo ![2]!,![32]!,![33]!,![35]! になります。 echo off setlocal ENABLEDELAYEDEXPANSION for /F "delims=" %%A in (myfile.csv) do ( set n= for %%a in (%%A) do ( set /a n=n+1 set [!n!]=%%a ) echo ![2]!,![32]!,![33]!,![35]! ) endlocal

  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.2

#1です。 リンク先を見落としていました。今試してみしたら確かに32以降は指定しても取得できないようです。仕様ですかね。 具体的にどれくらいの列を指示したいのでしょうか。 リンク先のような方法か、call文の引数で渡してサブルーチンで分解するくらいしか方法が思いつきません。スミマセン。

testAdmin
質問者

お礼

pita-gora様 ご回答ありがとうございます。 32bit版OSが関係しているのではないかとの噂を耳にしました・・・。 謎です。 仕方がないのでVBSで処理いたしました。 ありがとうございました。

  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.1

こんにちは。 ---------------------------------------------------------- FOR /F "eol=; tokens=2,32 delims=, " %i in (myfile.csv) do @echo %i %j %k ---------------------------------------------------------- >tokensで指定している32列目(カンマが32個目)以降の値を取得しません。 >なぜでしょうか。 tokens=2,32 が、2列目を%i に、32列目を%j に入れなさいという指示です。32列目以降については指示されていません。 FOR /F "eol=; tokens=2,32* delims=, " %i in (myfile.csv) do @echo %i %j %k とすれば、2列目を%i に、32列目を%j に、32列目以降の残りすべてが %k に入ります。 FOR /F "eol=; tokens=2,32-35 delims=, " %i in (myfile.csv) do @echo %i %j %k %l %m とすれば、2列目と32列から35列目までの内容を取得できます。

testAdmin
質問者

お礼

pita-gora様 ご回答ありがとうございます。 処理の概要は理解しているのですが どうにも値を取得しませんでした。 しかたがないのでVBSで記述しました。 ありがとうございました。

関連するQ&A

  • バッチファイル(for文)がうまく動かない

    以下のようなバッチファイルをWin2008上で実行しようとしています ------------------------------ @echo on set LOGFILE=C:\a.log set CONF=C:\a.txt FOR /F "tokens=1-3 delims=," %%i in (%CONF%) do ( echo %%i %%j %%k > %LOGFILE% 2>&1 ) ------------------------------ C:\a.txtの中身はこのようになっています ------------------------------ a,b,c e,f,g ------------------------------ 期待する結果は「1.」なのですが.batを実行しても「2.」の結果がログに表示されます どのように修正すれば期待の結果が得られますでしょうか ※ちなみに.batの実行ではなくコマンドプロンプトで[%%]を[%]に変更すれば正常に実行できました 1. ------------------------------ a b c e f g ------------------------------ 2. ------------------------------ e f g ------------------------------

  • MS-DOSバッチファイルで

    度々ご教授お願い致します。 以下のようなMS-DOSバッチファイルで、xcopy コピー元 コピー先のようにしたいのですがこれではうまくいきません。 どのようにしたら良いでしょうか。宜しくお願い致します。 FOR /F "eol=; tokens=1,2 delims=, " %%i in (c:\a.txt) do (@echo %%i %%j) xcopy %%i %%j /s /o /y >> (@echo %%i %%j)

  • バッチ処理(for文)について

    set echo off pause set TEST="1,2,3,4" pause for /f "delims=," %%i in (%TEST%) do echo %%i pause ------------------------------------------- 結果(希望):  1  2  3  4 の様な出力を行いたいのですが、 結果(現実)  1 のような出力になってしまいます。 [TEST]の値は固定(ダブルクォーテーションで囲まれた文字列)で何とか、カンマ区切りで取得したデータの回数、回す事は出来無いでしょうか。 稚拙な文章ですが、宜しくお願い致します。

  • バッチで118項目のCSVを処理したいですが。。。

    バッチファイルで一行に、118項目のあるCSVファイルを読み込んで、必要な項目を抽出して、新しいCSVを作りたいです。 いろいろ調べたら for /f "delims=, tokens=1-3" %%I in (sample.csv) do ( echo %%I %%J %%K>> new.csv ) で実現できると思っていましたが、tokensに値の制限があって、tokens=1-118にすると、うまくいかないです。 どなたかいい方法をご存知でしたら、教えていただきたいですが。

  • バッチファイルで条件によって書き出さないようにしたい

    temp.txtというファイルのカンマ4つめが同じだったらテキストに出力しないバッチファイルを作りたいと思っています。 set sbuf=test for /f "tokens=4 delims=, " %%a in (C:temp.txt) do ( set saddress=%%a if %sbuf% == %%a ( ) else ( set saddress=%%a findstr %saddress% C:\sip_cmail\ping_sip.txt >> C:\out.txt ) set sbuf=%%a ) と書いてみたのですが、動きません。 流れとしては、一巡目に通ったときの値をbufにいれておいて、二順目通ったときに比べ、同じだったら何もしないで次に行く、としたいのですが、、 括弧が何十にもなると出来ないのでしょうか。 よろしくお願い致します。

  • FOR文ないでの判定処理

    a.logというテキストの値を、一行づつ取り出して、ある値より大きいかの判定を行いたいのですがうまくいきません。 イメージ的には下記のような感じです。 FOR /F "eol=; tokens=3 delims=, " %%j in (C:\PerfLogs\memory_02071801.csv) do ( set MEMORY=%%j set MEMORY=%MEMORY:~1,6% rem 値が20000がより大きい場合はエラーメッセージを表示する。 if %MEMORY% GTR 20000 net send %COMPUTERNAME% %ERRTXT% ) ・memory_02071801.csvの内容 "02/07/2007 18:34:36.075" "150836" "02/07/2007 18:34:51.093" "151020" "02/07/2007 18:35:06.110" "151252" "02/07/2007 18:35:21.128" "151360" 上記ではうまく動いてくれません。 もしわかる方いらっしゃったら教えていただけませんでしょうか。

  • バッチでcsvファイルの指定のカラムを編集したい

    バッチでファイルの編集をしたい バッチファイルを使用して、csvファイルの読み込み~編集を行いたいと思っております 元ファイル:TEST_DATA.csv 内容: 111,222,333,444,555 123,456,789,321,987 上記のcsvファイルを読み込み、 ・5カラム目が987ならば3カラム目を654に変更する という処理を実行させたいのですが、 どのように行えばよいのでしょうか? 現在考えていることは、 1.for文を使用して指定のカラムを抜く(3カラム目と5カラム目を抜く)) 2.5カラム目の値をif条件に指定し、合致した場合、抜いた3カラム目の変数に654を入れる 3.654に変更した変数を3カラム目の値として入れる という順番で行えばいいと思っているのですが、 下記まで行ったところで行き詰ってしまいました for /F "tokens=3,5 delims=," %%i IN (TEST_DATA.csv) DO @(if %%j==987 set %%i=654 echo %i %j ) お分かりになられる方、ご教授願えませんでしょうか

  • バッチのFOR及びIF文

    バッチであるTEXTファイルから一部を置換して別のファイルを作成する処理を考えてます。 「あるTEXTファイル」にはSQL文があります。 SELECT CODE ||'","'|| NAME FROM TEST01 WHERE (UPDATEDATE || UPDATETIME) > TO_CHAR(_HENKAN_) の内容が入ってます。 このファイルから「_HENKAN_」をバッチファイル内で置換し、実行できるSQLファイルを作成する処理です。 しかし、FOR文の中のIF文で全然動かないです。 FOR /F "tokens=1 delims=" %%A IN (C:\sql.txt) DO ( if /i %%A=="TO_CHAR(_HENKAN_)" ( echo TO_CHAR(%HENKAN%) >> %出力ファイル% 2>&1←%HENKAN%は時間を設定済み*ここが問題 echo %%A ←テストのため ) else ( echo %%A >> %出力ファイル% 2>&1 ) ) 実行時はエラーはなく実行されますが、echo TO_CHAR(%HENKAN%)が全然効かないようです。 いや、そもそも if /i %%A=="TO_CHAR(_HENKAN_)"が効かないですね。echo %%Aで全SQL文が表示されます。 いろいろ調べたのですが、理由がわかりませんでした。 バッチに詳しい方は教えてください。 よろしくお願いします。

  • 【DOSコマンド】for の デリミタにダブルクォーテーションを使うには

    下記のような1行だけ書かれたテキストファイルがあり、その中からダブルクォーテーションで囲まれた部分を抜き出そうとしています。 --【abc.txt】----------------------------------------------------------- Command Line: "C:\Program Files\test\test.exe" ---ここまで------------------------------------------------------------- (C:\Program Files\test\test.exe を抜き出したい) DOSコマンドのfor文を使って抜き出そうとしたのですがダブルクォーテーションをどうやってデリミタに指定したらいいのかわかりません。   for /f 'delims=" tokens=2' %i in (test.txt) do @echo %i  とか   for /f "delims="" tokens=2" %i in (test.txt) do @echo %i など いろいろやってみたのですがエラーが出ました。 試しにテキストファイルのダブルクォーテーションを”+”に置き換えて試したところうまく出来たので、デリミタの指定の仕方だけだと思うのですが、どうしてもわかりません。 Command Line: +C:\Program Files\test\test.exe+   に対して for /f "delims=+ tokens=2" %i in (test.txt) do @echo %i はうまく出来ました。 どなたかご享受願えませんでしょうか。 よろしくお願いします。

  • バッチファイル FOR文 

    こんにちは、 リモートクライアント40台に対して、フォルダを作成するバッチファイルを書きたいと考えています。 (リモートコンピュータ名:PC01からPC40) FOR /L %%i IN (1,1,40) DO mkdir "\\pc%%i\c$\test" とすると、 01,02,03・・とは変数が入らず、1,2,3と入っていくためエラーが起きます。 上記の事で、うまいバッチファイルの書き方はありますでしょうか?何かお分かりの方がいましたら教えてください。よろしくお願いします。 ほか、上のバッチファイルではエラー無視しないように思うのですが、エラーを無視しながら進めていくにはどうすればいいのかもあわせて教えていただけると助かります。

専門家に質問してみよう