DOSコマンドを使ったCSVファイルの結合方法と列データの抽出について

このQ&Aのポイント
  • DOSのコマンドを使って複数のCSV形式のファイルを結合しようとしていますが、一部の列データが正しく抽出されない問題が発生しています。
  • 現在、実行すると1列目から29列目までは期待どおりの結果が得られますが、32列目と45列目のデータが正しく取得できていません。
  • この問題の原因を特定し、正しい列データの抽出方法を教えていただける方がいらっしゃいましたら、ご協力をお願いします。
回答を見る
  • ベストアンサー

ファイルの結合について

いつもお世話になっております。 早速ですが、 DOSのコマンドを使って複数のCSV形式のファイルを結合しようとしています。 ちなみに目的の列データのみを抽出したいのですが、思いどおりに動きません。 ↓がDOSのコマンドです。 @echo off for %%F in (*.csv) do (  for /f "tokens=1,2,8,11,14,17,20,23,26,29,32,45 delims=," %%L in (%%F) do (   echo %%L,%%M,%%N,%%O,%%P,%%Q,%%R,%%S,%%T,%%U,%%X,%%Y  ) ) 実行すると、 1列目から29列目までは期待どおりの結果なのですが、32と45列目が %X,%Yとなってしまいます。 記述に問題はありますでしょうか。 お解かりの方おりましたらご協力宜しくお願いいたします。

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

  • ベストアンサー
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.1

10個までということなのかな?よく分からないけど。 こんなのはどうでしょう。 バッチファイルのFOR文について【tokens~】 - その他(開発) | 教えて!goo http://okwave.jp/qa/q4939331.html @echo off setlocal ENABLEDELAYEDEXPANSION for %%F in (*.csv) do (  for /F "delims=" %%A in (%%F) do (    set n=   for %%a in (%%A) do (    set /a n=n+1    set [!n!]=%%a   )   echo ![1]!,![2]!,![8]!,![11]!,![14]!,![17]!,![20]!,![23]!,![26]!,![29]!,![32]!,![45]!  ) ) endlocal

icevain
質問者

お礼

pringlez さん、丁寧なご回答ありがとうございます。 バッチリ解決です。 今後とも宜しくお願いします。

関連するQ&A

  • Windows2000 バッチファイルコマンドについて

    こんにちは。 バッチファイルコマンド(DOSコマンド?)について質問があります。 まずやりたい事としては、 「前月日付のフォルダを自動作成したい」 です。 当月日付をもってくる為には以下の様なコマンドでできました。 for /f "tokens=1-2" %%l in ('date /t') do set today=%%l for /f "delims=/ tokens=1-2" %%a in ('echo %today%') do set yymm=%%a%%b このコマンドを実行すると、例えば、%yymm%には200507が入っています。 このコマンドを応用して、前月日付(200506)を取得したいのですが、何か言い方法はありませんでしょうか? また、新たなやり方あるのでしたら教えて頂けないでしょうか?

  • 【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 はうまく出来ました。 どなたかご享受願えませんでしょうか。 よろしくお願いします。

  • バッチで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にすると、うまくいかないです。 どなたかいい方法をご存知でしたら、教えていただきたいですが。

  • 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

  • バッチでファイルの読み込み

    Windowsバッチでファイルの読み込みをしようと思っているのですが、 下記コマンドの実行で「ファイルが見つかりません」となります。 ※パスにスペースを含むのでusebackqを使用しました。 FOR /F "usebackq tokens=1,2 delims= " %%i in ("c:\temp 1\data.txt") DO echo %%i WindowsServer2003でうまくいかなかったのですが、 Xpですれば問題なくファイルを読み込めました。 何か差があるのでしょうか?

  • FORコマンドで不定期に表示される意味不明なメッセージを回避する方法は?

    (「Windows/Windows Vistaフォーラム/Answersアシスタント」から飛ばされてきました。よろしくお願いします) 以下の様なバッチファイル(for1.bat, for2.bat)を作成して、コマンドプロンプトで何回か実行すると、正常な出力と同時に、不定期に「ファイル が見つかりません。」という意味不明なメッセージが表示されます。 これは何で、どうすれば回避できるのでしょうか? コマンドラインオプションとしてダブルクォートされた文字列を引数にとるバッチファイルを作りたいのですが、 > foo.bat " a""a " のような呼び出し方をした時に挙動がおかしくなったので、その原因を調べていたら、FOR文が時々不可解な動作をしていて、その典型的な例をfor1.batとfor2.batにまとめた次第です。 ---8<---8<---8<---[for1.bat:ここから ]---8<---8<---8<---8<--- @ECHO OFF CALL :SUB "a""a" CALL :SUB " a""a" CALL :SUB "a ""a" CALL :SUB " a ""a" CALL :SUB "a"" a" CALL :SUB "a""a " CALL :SUB "a"" a " CALL :SUB " a"" a" CALL :SUB "a ""a " CALL :SUB " a "" a " CALL :SUB " a""a " CALL :SUB "a "" a" CALL :SUB " a "" a" CALL :SUB " a ""a " CALL :SUB " a"" a " CALL :SUB "a "" a " GOTO EOF :SUB FOR /F "tokens=*" %%a IN ("%1") DO ECHO %%a EXIT /B 0 :EOF ---8<---8<---8<---[for1.bat:ここまで ]---8<---8<---8<---8<--- ---8<---8<---8<---[for2.bat:ここから ]---8<---8<---8<---8<--- @ECHO OFF FOR /F "tokens=*" %%a IN (""a""a"") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a""a"") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a ""a"") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a ""a"") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a"" a"") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a""a "") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a"" a "") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a"" a"") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a ""a "") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a "" a "") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a""a "") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a "" a"") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a "" a"") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a ""a "") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a"" a "") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a "" a "") DO ECHO %%a ---8<---8<---8<---[for2.bat:ここまで ]---8<---8<---8<---8<---

  • 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文について【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 どのようにしたら、目的を果たせるのでしょうか。 ご教授ください。

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

    以下は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

  • msdosのfor /fのtokens=の挙動

    Windows7のmsdosのfor /fのtokens=の挙動ですが、 tokens=1,3とした時は1番目と3番目のトークンが取り出され tokens=1-3とした時は1番目~3番目のトークンが取り出される のではないのでしょうか。 例えば、以下のような例の場合、 test1.batでは、 a b d f test2.batでは、 a b c d e f となるように思うのですが 実際には、どちらも、 a b d となり、1番目のトークンしか 取り出されていないのですがなぜなのでしょうか。 ---test.txt--------------------------- a b,c d,e,f ---test1.bat------------------ for /f "tokens=1,3 delims=," %%a in (test.txt) do ( echo %%a ) ---test2.bat------------------ for /f "tokens=1-3 delims=," %%a in (test.txt) do ( echo %%a ) ------------------------------

専門家に質問してみよう