• ベストアンサー

バッチファイル作成で困っています。こんな事出来ますか?

・仕事で初めてバッチファイルを作っていますが、CSVファイルの連番が思っていたのと違う為出来なくて困っています。どうか教えてください。 作業内容を記します。 〔内容〕  ・Logフォルダー内に今300件以上のCSVファイルが有ります。  (Logフォルダーの名前は日付で毎日0:00に更新され、yyyymmdd形式です。例:今日が6/22だと「20060623」)  ・Logフォルダー内のCSVファイルの名前はCL増設時以下の規則で付いています。(今後CL数が増えればCSVファイルの数も増加します。) CL0001  CL0010  CL0020 ・・・  ↓    ↓    ↓ CL0009  CL0019  CL0029 ・・・ CL000a  CL001a  CL002a ・・・  ↓    ↓    ↓ CL000f  CL001f  CL002f ・・・  ・0:00以降、上記CSVを全て1つのCSVファイルに結合し、名前を日付から1を引いて昨日の日付(例:「20060622」に変更して汎用Hostに0:30分にFTPで送ります。 ・昨夜DOS系のサイトを必死で検索し恥ずかしいのですが、以下の様な バッチを始めて作成したのですが、CSVファイルが16進で付いているのを知らずCL0001~CL0999で作ってしまいました。現在、a~fのところが自分ではどうして良いか全く分かりません。又、Error処理が検索サイトの解説を読んでも旨く出来ません。 〔バッチ〕 @echo off setlocal set da=%date:~0,4%%date:~5,2%%date:~8,2% set /a x=%da%-1 d: cd "D:\data\CL_Logs\Logs\%x% for /l %%n in (1 1 9) do type JL000%%n.csv >> %x%.csv for /l %%n in (10 1 99) do type JL00%%n.csv >> %x%.csv for /l %%n in (100 1 999) do type JL0%%n.csv >> %x%.csv ftp -s:c:\Logs_ftp.txt >> ftp.log endlocal ・CSVファイルのの「CLxxxx」の番号はCLが無くなると欠番になりますが、その処理は必要無いと思っています。 どうか宜しくお願いいたします。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1>今回求めたいのはcsvファイルの名前の結合ではなく、フォルダー内のCSVファイルの中身を全て1つのCSVファイルにしたいのです それは、わかっています。 dir /ON /B JL*.csv >filelist.dat FOR /F "delims=" %%i in (filelist.dat) do type "%%i" >>%x%.csv del filelist.dat の様にすることで、ファイル名のリストを整列して その順番で結合することができます。 #1でも言っているようにファイル名のリストを作成するのは、 あくまで作業のために作るということです。 言葉が足りずにすみません。

yazaemon
質問者

お礼

・今回の回答でやっと分かりました本当に有難ございました。 FOR /F "delims=" %%i in (filelist.dat) do type "%%i" >>%x%.csv この方法して見たかったのでWebで見て色々書いて見ましたがAll NGでした。これで少しForが分かった様に思います。(独りよがり・・・) ・これで月曜日に間に合いますし、この式だと環境の変化について行けそうです。本当に有難うございました。

その他の回答 (3)

noname#27709
noname#27709
回答No.4

私もBLUEPIXYさんのおっしゃる方法がとてもよいと思いますが・・・。 ◎順番に保証されなくてよいのなら・・・ -- @echo off set YYYYMMDD=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2% set /a YYYYMMDD2=%YYYYMMDD% - 1 set TARGET_DIR=D:\data\CL_Logs\Logs\%YYYYMMDD2% cd /d %TARGET_DIR% type JL????.csv >> \%YYYYMMDD2%.csv ftp -s:c:\Logs_ftp.txt >> ftp.log -- では、ダメでしょうか? ◎順番の保証が必要なら、 -- @echo off setlocal set YYYYMMDD=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2% set /a YYYYMMDD2=%YYYYMMDD% - 1 set TARGET_DIR=D:\data\CL_Logs\Logs\%YYYYMMDD2% set TEMP_FILE=filelist.txt cd /d %TARGET_DIR% dir /B /ON *.csv > %TEMP_FILE% for /f "tokens=1" %%i IN (%TEMP_FILE%) DO ( echo type %%i >> %YYYYMMDD2%.csv ) ftp -s:c:\Logs_ftp.txt >> ftp.log -- でどうでしょうか?

yazaemon
質問者

お礼

・有難うございます。教えて頂いたとおりすると見事にFTPできました。 for /f "tokens=1" %%i IN (%TEMP_FILE%) DO ( echo type %%i >> %YYYYMMDD2%.csv は全く気づきませんでした。  本当に有難うございました。

回答No.3

C:\>for /r c:\windows %n in (*.txt) do cmd /c "copy c:\s.txt+%n" このコマンドでc:\windows 下の*.txtファイルの付加することができます。先にc:\s.txtを作成しておいてください 参考してください

yazaemon
質問者

お礼

・有難うございます。こんな方法があるとは思いませんでした。有難うございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

全部結合するなら、分けて処理する必要は無いような気がします。 ファイルの結合の順番が関係あるなら、 dir /B /ON *.csv >filelist.txt みたいな作業ファイルを最初に作って ファイルから処理リストを得るようにして 最後に作業ファイルを消すというような感じでいいんじゃないでしょうか

yazaemon
質問者

補足

早速の回答有難うございました。質問の仕方が悪かった様なので補足します。 ・今回求めたいのはcsvファイルの名前の結合ではなく、フォルダー内のCSVファイルの中身を全て1つのCSVファイルにしたいのです。故に私の拙いバッチでもTYPEコマンドでCSVを表示しその内容を新しい1つの共通の名前のCSVに結合しています。すみませんがご指導宜しくお願いします。

関連するQ&A

  • バッチファイル作成で又また困っています。

    ・質問No (No.2233751)でCSVファイルの結合でお世話になったyazaemonです。皆様に助けて頂いたばかりですが、上司より過去のLogもHOSTへFTPしたいので・・・出来ないかとの「とほほ」が入りまして、教えていただいた「FOR /F "delims="」を使い考えましたが挫折しています。すみませんがご教授お願いします。 〔内容〕  D:\data\CL_Logs\Logs\でLogsフォルダー内にYYYMMDD形式で名前の付いたフォルダー(2年分のフォルダー:365x2=約730個)が有ります。そのフォルダー内には、それぞれ300件以上のCSVファイルが有ります。今後の日付でのCSVファイルの結合とFTPは助けていただいてバッチシOKとなりました。  今回はLogsフォルダー下の過去の日付のフォルダー(例:20050505)内の300件以上のCSVファイルの内容を結合した2005050.CSVを作成し、FTPすると言うものです。  〔ヘナチョコ未完成バッチ〕 @echo off setlocal set TARGET_DIR=D:\data\CL_Logs\Logs cd /d %TARGET_DIR% dir /ON /B > dirlist.dat FOR /F "delims=" %%i in (dirlist.dat) do type "%%i" >>dir.csv ---ここで行き詰まりです。 Logsフォルダーにdir.cvsを作りそれをFORコマンドで利用しと思い試しましたが玉砕しました。理論適には多分dir.csvの1行目にcdしcsvファイル用のfilelist.datを ・dir /ON /B JL*.csv >filelist.datの様に作成し、 ・FOR /F "delims=" %%i in (filelist.dat) do type "%%i" >>??? の様にすれば結合したcsvが出来るのだろうと思いますが技量が全く足りません。又、>>???のファイル名をCSVが入っているカレントの過去の日付の(例:20050505.csv)にする方法とかは検討も付きません。  厚かましいお願いですが宜しくお願いいたします。

  • バッチファイルにてFTPで指定したファイルを取得する

    OSはWindoswXPProです。 以下のようなBATファイルとバッチファイルを作成しました。 ---FTP.bat--- echo off ftp -s:get.ftp ---get.ftp--- open 10.0.X.X username password cd /log get log.yymmdd(実際には日付) c:\access_all_log.txt quit logというディレクトリには日次でログファイルが作成され ファイル名としてlog.yymmddと名づけられています。 やりたいことは2つあります。 1つめはftpするファイル名の日付部分をコマンドなどから 範囲指定して取得するファイルを指定できないか。 (たとえば070301~070315のファイルを一括で取得したい) 2つ目はftpでのファイル取得終了後に続いて バッチスクリプトを流したいのですが、その方法。 お分かりになる方いらっしゃいましたらよろしくお願いいたします。

  • バッチファイルについて質問させて下さい。

    下記のようなcsvファイルまたはテキストファイルに纏めた移行元パス、移行先パスの情報をfor /fで行毎に参照しコピー処理を行うバッチファイルを作成したいと考えているのですが頓挫しております。 出来るだけバッチファイルで実現したいのですが可能でしょうか。お手数ですがご教示下さい。 (コマンドはxcopyを想定しています。) ------file.csv---------- 移行元パス1,移行先パス1 移行元パス2,移行先パス2 ・        ・ ・        ・ ---------------------- for /f "delims=,"%%a in (file.csv) do xcopy %%a 上記では移行先が指定できないので動きませんでした。

  • バッチコマンドで指定行を抽出しファイル名を含める

    日付毎に複数ファイルになっているftpのログファイルから必要な行だけを1ファイルに まとめたいのです set spath=d:\データ for /d /r %spath% %%d in ( * ) do ( type "%%d\*.log"|findstr /i ".csv">>%spath%\抽出ログ.txt ) で目的のものにかなり近いデータを抽出することができました ex110825.log 00:01:21 172.21.111.123 [6443]created /hoge/hoge.csv 226 しかし問題がありこのデータには日付がありません 日付部分はファイル名に含まれていますex110825.logのように・・・・ なので ex110825.log 00:01:21 172.21.111.123 [6443]created /hoge/hoge.csv 226 工夫次第でこのような形でデータを出力する事ができるでしょうか? アドバイス下さい

  • バッチファイルでの計算方法

    一行のみのtxtファイル(1111.txt)に日付 スペース 時間 スペース 値 が格納されています。 バッチファイルにて上記値に定数(6666)をかけ単位を追加して出力(2222.txt)したいとおもいます。 以下のように書いてみましたが どこが悪いかよくわかりません。 どなたかお教えいただきたいと思います @ECHO OFF FOR /F "eol=# tokens=1,2,3" %%a in (1111.txt) SET /A x=6666 SET y=%%c*%x% DO ECHO %%a %%b %%y >2222.txt

  • バッチファイルについて

    教えて下さい。 複数のログファイルを、バッチファイルをつかってひとつのCSVファイルにまとめます。 forfiles コマンドを使って、所定内の*.csv ファイルを typeで出力し 1つのCSVファイルにまとめます。 しかし、各ログファイルの文末が改行されておらず1つにまとめると 前のファイルの行末に次のログファイルの1文字目が来てしまいます。 ログファイルを、全て添付の下側の画像のように改行する設定にできたらいいですが 数が多いのでバッチコマンドに何か手を加える方向でいきたいです。 改行のCSVファイルを用意して、ログファイルの間に繰り返しかませることも できるならありかと考えています。 何かいい方法はないでしょうか?

  • 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)を取得したいのですが、何か言い方法はありませんでしょうか? また、新たなやり方あるのでしたら教えて頂けないでしょうか?

  • バッチファイルの使い方について

    このサイトで、両面スキャンした画像ファイルを表面と裏面を別々のフォルダに振り分ける方法を質問して、バッチファイルを使う方法を教えてもらったのですが、上手くいきません。バッチファイルを使うのは初めてなので、どこかまずいところがあるのかと思います。 教えていただいた下記のものそのままでバッチファイルを作り、画像ファイル(jpg)を格納したフォルダに置いてダブルクリックすると、「1」「2」のフォルダができるだけで、画像ファイルは移動せず、2つのフォルダは空のままです。 どこを直せばよいのか教えてください。よろしくお願いします。 set N=1 mkdir 1 mkdir 2 for %%I in (*.jpg) do call :sub %%I goto :EOF :sub move %%I %N% set /a N=3-N goto :EOF

  • バッチファイルで昨日の日付を取得

    すみません、どなたか教えて下さい。 バッチファイルの記述で、昨日の日付を取得する方法を教えて下さい。 今日の日付は下記のように取得しています。 rem 日時変数の取得 for /f "tokens=1-3 delims=/" %%a in ('echo %date:~-10%') do ( set YYYYMMDD=%%a%%b%%c )

  • バッチファイルでファイル削除ができない

    こんにちは。バッチファイルについてご質問です。 OSはWindows2003 Serverです。SQL Server2008を使用しております。 SQLエージェントを使用して、以下フォルダに、YYYYMMDDhhmmss.bakというタイトルをつけて、デイリーでバックアップを取っております。 C:\backup\log\ 日々ファイルが増えていくので、最新のファイル5個だけ残したいと思い、 以下のバッチファイルを作成しましたが、"20110111130339.bak"が見つかりませんでした。 というエラーが表示されて、ファイルが削除できません。 フォルダ内には、同タイトルのファイルがあります。 for /f "skip=2" %F in ('dir /b /o-n C:\dbbackup\log\??????????????.bak') do del %F よろしくお願いいたします。