みなさん、お仕事で何かのシステムからCSV/Excelなどのデータをダウンロードして加工するようなことはありますか?
私はとあるシステムからCSVデータを出力させて、それを加工して集計する業務を日常的に行っています。...が、落としたデータに名前をつける作業が地味にめんどくさい。
そこで今回は、この面倒なリネーム作業をWindowsの標準機能だけで自動化できちゃうよ!という知識を共有させてもらいます。ぜひ参考にしてみてください👍
🛠️ ファイルだけ欲しい方はこちら (batファイル/無料)01. 作ったきっかけ:地味にめんどい作業だったから
私が所属している会社では、SaaSを使ったWebアプリケーション上に社員が事業実績を入力し、そのデータを集計して日々の事業管理を行っています。超ざっくりな構成は以下のような感じ。
まあ要するに、Web上のシステムからデータをPCにダウンロードしてきて、それを加工して使ってるわけです。
で、今回の作業対象が画像右側のCSVの部分です。私の業務の場合、ダウンロードしてくるファイル(テーブル)が15個程度あり、それぞれに「テーブル番号」「テーブル名称」「取得年月日」の情報をファイル名称として付与しています。
これらファイルそれぞれの命名規則を覚えるのは大変ですし、手作業はミスの温床です。過去に付与したファイル名からコピーしてくればいくらか楽にはなりますが、手作業であることに変わりはありません。
そこで今回活躍するのが、みなさんのパソコン(Windows限定ですが)にも最初から入っている「Windows PowerShell」。これを活用して、面倒な作業から解放されよう!ってのが今回ご紹介するアイデアなのです。
(ここで、命名付与~保存までスクリプトで自動化できるでしょ...というエンジニアの方からのツッコミは受け付けません😅)
02. 使い方:ダウンロードしてきたデータを放り込むだけ
使い方は簡単、名前を付けたいファイル群と↓に添付したbatファイルを空のフォルダに保管して、ダブルクリックして実行するだけ!簡単でしょ?
🛠️ ファイルだけ欲しい方はこちら (batファイル/無料)batファイルをダブルクリックすると以下のような画面が表示されるので、実行すればあら不思議。ファイル名称が全て書き換わります。
怪しいファイルじゃないか心配…という方は、後ほど掲載するコードをメモ帳にコピペして自作するのでもOK!zip形式で配布しているので、解凍してご利用ください。
もちろん、あなたのお好みでコードを改変していただければ、CSVファイルに限らず画像や音声など、他のファイルでも一括変更することが可能です。
一点注意として、このファイルを保存する際は、必ず文字コードを「ANSI」にすることをお忘れなく。ファイル名称が文字化けしてエラいことになります😅。
03. 解説:コマンドの中身はこんな感じ
上記で添付したbatファイルをそのまま使う人はいらっしゃらないでしょうから、中身を覗いてみましょう。実際のコードは以下の通りです。
set "D=%DATE:/=%"
set "COUNT=1"
echo =======================================
echo フォルダ内のCSVを名前順にリネームします
echo =======================================
echo.
for /f "delims=" %%F in ('dir /b /o:n *.csv') do (
if !COUNT!==1 set "NEWNAME=01_ホーム&キッチン_販売データ(!D!時点).csv"
if !COUNT!==2 set "NEWNAME=02_スポーツ&アウトドア_販売データ(!D!時点).csv"
if !COUNT!==3 set "NEWNAME=03_ビューティー_販売データ(!D!時点).csv"
if !COUNT!==4 set "NEWNAME=04_家電&カメラ_販売データ(!D!時点).csv"
if !COUNT!==5 set "NEWNAME=05_書籍_販売データ(!D!時点).csv"
if !COUNT!==6 set "NEWNAME=06_おもちゃ_販売データ(!D!時点).csv"
if !COUNT! leq 6 (
ren "%%F" "!NEWNAME!"
echo !COUNT!個目: [変更前] %%F -^> [変更後] !NEWNAME!
)
set /a COUNT+=1
)
echo.
echo =======================================
echo すべてのリネーム処理が完了しました!
echo =======================================
pause
ECサイトの管理部門の方が、担当する販売カテゴリ別にデータをダウンロードしてきて名前を付ける場面を想定してみました。これらのコードを細かくブロックに分けて順番に解説していきます。
※なお今回ご紹介するコードは、ダウンロードしたデータを名前で昇順に並べた順に、名称を更新していくものとして解説しています。
@echo off
コードを実行する際、画面(ターミナル)にコマンドの実行ログを長々と表示させない指示です。これを記述することで、コード実行時の結果がスッキリ見やすくなります。
setlocal enabledelayedexpansion
後のコードの中で出てくる繰り返し処理(for...の部分)を行うために、「変数の遅延環境変数の拡張(遅延評価)」を有効化しています。これでは何のことか分からないと思いますが、今は繰り返し処理実行前のおまじないだと思ってください。
set "D=%DATE:/=%"
今日の年月日を「%DATE%」の部分で取得し、変数「D」に格納しています(変数Dは任意の名称、記憶される値は「YYYY/MM/DD」の形式)。そして、「:/=」の部分で、「/」を「」(空文字)に変換、つまり「/」を削除しています。Windowsのファイル名には「/」などの記号は使えないためです。
例えばコードを実行した日が2026/08/30ならば、変数Dには「20260830」が入るわけですね。もし年月日の間に何か記号を追加したい場合は、「:/=」の部分を「:/=_」などにすると、「2026_08_30」となるわけです。
ちなみに、年月日に加え時間を取得したい場合は「%TIME%」を使えば「HH:MM:SS.ss」の形式で取得できます。
set "COUNT=1"
ファイル名に対し、順に1,2,3…と番号を振るためのカウンターを宣言しています。初期値として「1」をセットしていますが、任意の数値から開始することも可能です。
*for /f "delims=" %%F in ('dir /b /o:n .csv') do (
フォルダ内にあるすべてのCSVファイルを対象に、ファイル名を昇順に1つずつ順番に取り出して処理するためのループの開始宣言です。一つずつ、パーツに分けて説明します。
「for /f」は、ファイルの中身やコマンドの実行結果(テキストデータ)を1行ずつ読み込んで処理するための、バッチファイルにおけるループ機能を使うための記述です。
「"delims="」は、区切り文字(空白)以降にある文字列を切り捨てないように指定しないための記述です。これを指定しないと、ファイル名に半角/全角の空白が含まれていた場合、そこで名前が勝手に切れてしまいループ処理停止の原因になります。ファイル名は空白が含まれていても途中で切らず、丸ごと全部ワンセットで扱ってね、ということですね。
「%%F」は、繰り返し処理の中で一時的にファイル名を記憶しておくための箱の名前です(名前は任意ですが、今回はFileの「F」を使ってます)。処理が繰り返される度に、1つ目のファイル名、2つ目のファイル名...と中身が入れ替わっていきます。
「in ('dir /b /o:n *.csv')」は、更に分解されます。「'dir」でカレントディレクトリ(batファイルを置いた場所)を指定し、「/b」でファイルサイズや更新日時などの余計な情報をカットし、ファイル名.拡張子の情報だけを抜き出します。
「*.csv」の部分は、拡張子(ファイル名称末尾)が.csvの全ファイルを指定しています。この部分を「*.*」に変更すれば、拡張子に限らずどんなファイルでも更新対象とすることもできます。
「/o:n」の部分は、「/o」で並び替え(orderの「o」)を指定し、「:n」で名前(nameの「n」)を昇順にするよう指定しています(降順の場合は「:-n」)。他にも「:d」で日付順、「:s」でファイルサイズ順を指定することもできます。
「do ( ... )」は、ここまでの処理で見つけてきたファイルを、上から1つずつ %%F に代入して、後に続く処理:ren "%%F"~(リネームのコマンド)を繰り返し実行させる宣言をしています。
if !COUNT!==1 set "NEWNAME=01_ホーム&キッチン_販売データ(!D!時点).csv"
何番目に処理しているファイルか(二つ前の項で解説したCOUNTの値)を判定し、それぞれ「01_ホーム&キッチン_販売データ(20260905時点).csv」のような統一された形式の名前に置き換える設定をしています。
あなたの業務に合わせて「01_ホーム&キッチン_販売データ(!D!時点)」の部分を変更すれば、お好みの文字列に置き換わります。
if !COUNT! leq 6 ( ren "%%F" "!NEWNAME!" ... )
カウンターが6番目までのファイルについて、実際のファイル名変更(renコマンド)を実行し、「何個目のファイルをどう変更したか」をターミナル画面に表示させます。
ちなみに「leq」は「Less than or EQual」の文字列を省略した表記であり、「変数COUNTが6以下ならば...」という意味になります。今回ご紹介しているコード内では、1から6まではIF文が成立することになります。
set /a COUNT+=1
ファイルを1つ処理し終わるごとに、カウンター変数「COUNT」の数字を1増やします。次のループでは次の順番のファイル名が適用されるわけです。
なお「/a」の表記は、後ろに続く文字列「COUNT+=1」が数式であることを示すための記述です。これを付けないと、変数COUNTには「COUNT+1」という文字列が代入されてしまうので注意です。
pause
処理がすべて終わった後、黒いターミナル画面がいきなり消えてしまわないように一時停止させます。「何かキーを押してください」と表示されるので、結果を目視で確認してからウィンドウを閉じることができます。この画面が不要な場合は、pauseのコードを削除してもOK。
04. 注意点:わざわざこれを使う必要がない場面もある
30行もないコマンドですが、一つずつ解説していくと結構な文量ですね。ここまでの閲覧、お疲れ様でした。これを理解できると、お好みの設定に改変して流用できますので、ぜひヒマなときに読み返してみてください!👍✨
さて、ご紹介したコードを使えば、特別なソフトをインストールせずとも任意のファイル名称を楽に付与できるわけですが、わざわざこの仕組みを使う必要がない場面もあります。
というのも、Windowsのエクスプローラ(フォルダやファイルを管理する画面)には標準で番号を付与する機能があり、単純にファイル名末尾へ順番に数字を割り振りたいだけなら、こちらで十分です。
なお名前を付ける際、()の中の数字を自分で付与すると、任意の番号から始めることもできます。例えば、「データ(13)」と設定すればデータ(13),データ(14),データ(15)...という具合です。
ただし、割り振られる連番は(1),(2),(3)...という形式でしか指定できないので、これがイヤという方は前述のPowershellを使うのがオススメです。
ちなみに、macであれば任意の形式で名称を付けられるようです。WindowsではPowerToysをはじめとした別ソフトでないと、こういう操作はできないみたい。Microsoftくん、もう少し頑張ってくれ...👊
05. まとめ:ソフトがインストールできなくても効率化は可能
今回ご紹介したネタは、個人的には利用頻度が結構高いので重宝していますが、節約できる時間自体は短く、効果としては薄めです。
しかし、デスクワークってこういう単純な定型業務ってちょこちょこありますし、AIや誰かに頼むほどでもない。かと言って手作業だとミスに繋がるのが厄介です。
そんな中、私の業務では制約があるために、その制約の中でできる効率化でどんなことができるかな~と思った末のアイデアとしてご紹介させていただきました。
そもそもの話、CSVファイルをダウンロードして...名前を付けて...その後データを加工して...という手順自体、特に企業では各種システムの自動化によって今後減っていくものだと思っています。
ただ、仕組みの導入や自動化ってお金がかかりますし、所属する会社や部署が小さければ小さいほどそういう自動化や効率化と中々縁がないだろうなとも思っています。
同じプチストレスを抱えた方のお役に立てられればいいなと思い、今回のアイデアをご紹介させていただきました。システムが入れられないなら、自分で工夫しちゃいましょう。😎💪
以上、細かいネタでしたが参考になれば嬉しいです。それではまた。👋