csvのデータに従ってファイルをフォルダに移動する

大量のファイルを条件に合わせてフォルダに整理(移動)する処理を自動化してみました。エクセルで書き出したcsvを元にファイルをフォルダに移動します。動作環境はmacOSでPHPを使って実行しています。

遠隔授業を行うと学生の提出課題はデータになります。それらのファイルをグループごとに整理する方法です。学生から提出されたファイルのファイルネームには学生の学籍番号が含まれているとします。例えば、学生はA、B、Cのグループに分かれ、名簿はエクセルに入っています。提出課題ファイルをそれぞれのフォルダに移動して整理する場合に使えます。

CSVファイル

エクセルで学籍番号、グループが記入されたファイルを作成します。

このデータをCSV形式で書き出します。

学生リスト.csvの中身は次のようになっています。

学籍番号,グループ
203001,A
203002,A
203003,A
203004,B
203005,B
203006,B
203007,C
203008,C
203009,C
203010,C

PHPのコード

PHPのコードは以下の通りです。

<?php

$csvFileName = "学生リスト.csv";
//読み込むcsvのファイルネームを指定します。
//ファイルの場所は同じフォルダ(ディレクトリ)にします。

print("=====================================\n");

//ファイルを開き、読み取り
$file_handler = fopen($csvFileName, "r");
$csvHeader = fgetcsv($file_handler);//ヘッダー行を読み取り

//ヘッダーを覗き繰り返し処理
while($line = fgetcsv($file_handler)){
    //csvから読み取った番号を含むファイルネームをlsコマンドで選び出す
    $cmd = 'ls ' . "*" . trim($line[0]) . "*";
    exec($cmd, $opt);//$optにそのリストが入っている。

    //番号を含むファイルネームが複数ある場合には処理をその分繰り返す
    foreach($opt as $value){
         $cpCommand = "mv " . $value . " ./" . trim($line[1]);
         exec($cpCommand);
     }
}

 
?>

$csvFileName = “学生リスト.csv”;が読み込むcsvファイルです。
csvの2項目目がフォルダの名前になります。
csvに書かれた学籍番号の前後にワイルドカード*をつけてリスト表示をさせます。該当したファイルを指定されたフォルダに移動する。という処理を行なっています。

いくつか動作上の注意が必要な点があります。まずはファイルネームに空白が含まれるとコマンドの都合上、ファイルの移動が出来ません。事前に空白は消しておきましょう。または移動できなかったファイルネームに空白(半角スペース、全角スペース)が入ってないか確認してください。
それと、学籍番号はユニークである必要があります。また桁数の短い番号の場合にはファイルネームに含まれる他の数字に検索がヒットして誤動作する可能性もあります。

ファイルの配置

任意のフォルダを作成、その中に以下のようにファイルを置きます。

図の一番上は仕分け用のフォルダA,B,C
PHPのファイルとcsvファイル
その下が学生から提出されたファイルになります。提出ファイルのファイルネームは学籍番号が半角文字で入っています。そのほかに氏名や通し番号が入っている場合もあります。

フォルダA,B,CはPHPから操作できるようにアクセス権を設定しておきます。

上図はファイルメニューの情報を見るで表示される画面です。
everyoneが「読み/書き」になっているところがポイントです。

使い方

PHPを起動するためにターミナルを使います。ターミナルはアプリケーション>ユーティリティの中に入っています。

まずはPHPが使えるか確認してみます。

php -version

インストールされてて使える状態であればバージョン情報が表示されます。表示されない場合はPHPが使えないので、インストールしてください。(多分、macOSには標準でインストールされてると思います)

ターミナルに「cd」と入力して先ほどのフォルダをターミナルの画面にドラッグ&ドロップします。そしてreturnキー。すると作業フォルダに移動します。
そしてPHPの起動「php ./copyFile2Folder_csv.php」と入れてreturn。

一連の作業をムービーにしました。