コンテンツにスキップ

ファイルモードとフォルダモードとは

目的

ExcelInvoice処理におけるファイルモードとフォルダモードの違いと使い分けについて説明します。入力データの形式に応じた最適なモード選択と設定方法を理解できます。

課題と背景

ExcelInvoiceを使用した一括データ登録において、以下のような多様な入力形式への対応が必要でした:

  • 単一ファイル形式: 各データセットが1つのファイルで構成される場合
  • 複数ファイル形式: 各データセットが複数のファイルで構成される場合
  • 混在形式: ファイル数が異なる複数のデータセットを同時に処理する場合
  • 効率性: 大量のデータセットを効率的に処理する必要性

これらの課題に対応するため、ファイルモードとフォルダモードが設計されました。

主要コンセプト

モード判定の仕組み

flowchart TD
    A[ZIPファイル解凍] --> B{ディレクトリ構造確認}
    B -->|フラット構造| C[ファイルモード]
    B -->|階層構造| D[フォルダモード]
    C --> E[ファイル単位で処理]
    D --> F[フォルダ単位で処理]

2つのモードの比較

項目 ファイルモード フォルダモード
入力形式 1データセット = 1ファイル 1データセット = 1フォルダ
ZIP構造 フラット(ファイルが直接配置) 階層(フォルダで分類)
適用場面 単純なデータファイル 複合的なデータセット
処理単位 ファイル フォルダ
自動判定

ファイルモード

概要

各データセットが単一のファイルで構成される場合に使用されます。

ZIP構造例

1
2
3
4
5
experiment_data.zip
├── sample001.csv
├── sample002.csv
├── sample003.csv
└── sample004.csv

処理結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
data/
├── divided/
│   ├── 0001/  # sample001.csv用
│   │   ├── raw/
│   │   │   └── sample001.csv
│   │   ├── structured/
│   │   └── meta/
│   ├── 0002/  # sample002.csv用
│   │   ├── raw/
│   │   │   └── sample002.csv
│   │   ├── structured/
│   │   └── meta/
│   └── ...

使用場面

  • 測定データファイル: 各実験の結果が1つのCSVファイル
  • 画像ファイル: 各サンプルの顕微鏡画像
  • ログファイル: 各実験セッションのログ
  • 単純なデータセット: 追加ファイルが不要な場合

実装例

ファイルモード処理例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def process_file_mode_data(srcpaths, resource_paths):
    # divided/0001, divided/0002, ... の各ディレクトリを処理
    divided_dirs = [d for d in os.listdir("data/divided") if d.startswith("00")]

    for dir_name in divided_dirs:
        divided_path = Path("data/divided") / dir_name
        raw_files = list((divided_path / "raw").glob("*"))

        # 各ディレクトリには1つのファイルが存在
        if len(raw_files) == 1:
            input_file = raw_files[0]
            process_single_file(input_file, divided_path)

フォルダモード

概要

各データセットが複数のファイルで構成される場合に使用されます。

ZIP構造例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
experiment_data.zip
├── experiment_001/
│   ├── data.csv
│   ├── config.json
│   └── image.png
├── experiment_002/
│   ├── data.csv
│   ├── config.json
│   └── image.png
└── experiment_003/
    ├── data.csv
    ├── config.json
    └── image.png

処理結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
data/
├── divided/
│   ├── 0001/  # experiment_001用
│   │   ├── raw/
│   │   │   ├── data.csv
│   │   │   ├── config.json
│   │   │   └── image.png
│   │   ├── structured/
│   │   └── meta/
│   ├── 0002/  # experiment_002用
│   │   ├── raw/
│   │   │   ├── data.csv
│   │   │   ├── config.json
│   │   │   └── image.png
│   │   ├── structured/
│   │   └── meta/
│   └── ...

使用場面

  • 複合実験データ: データファイル + 設定ファイル + 画像
  • シミュレーション結果: 入力ファイル + 出力ファイル + ログ
  • 機器データ: 測定データ + キャリブレーションファイル + メタデータ
  • 関連ファイル群: 主データと補助ファイルのセット

実装例

フォルダモード処理例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def process_folder_mode_data(srcpaths, resource_paths):
    divided_dirs = [d for d in os.listdir("data/divided") if d.startswith("00")]

    for dir_name in divided_dirs:
        divided_path = Path("data/divided") / dir_name
        raw_files = list((divided_path / "raw").glob("*"))

        # 各ディレクトリには複数のファイルが存在
        if len(raw_files) > 1:
            process_file_group(raw_files, divided_path)

自動モード判定

判定ロジック

RDEToolKitは、ZIPファイルの構造を自動的に分析してモードを決定します:

モード判定例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def determine_excel_invoice_mode(zip_path):
    with zipfile.ZipFile(zip_path, 'r') as zip_file:
        file_list = zip_file.namelist()

        # ディレクトリが含まれているかチェック
        has_directories = any('/' in name for name in file_list)

        if has_directories:
            return "フォルダモード"
        else:
            return "ファイルモード"

判定基準

条件 判定結果
ZIPファイル直下にファイルのみ ファイルモード
ZIPファイル直下にフォルダが存在 フォルダモード
混在(ファイルとフォルダ両方) フォルダモード(優先)

実践的な使用例

ファイルモードの活用

測定データ処理
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def process_measurement_files(srcpaths, resource_paths):
    # ファイルモード: 各CSVファイルを個別処理
    for divided_dir in get_divided_directories():
        csv_file = find_csv_file(divided_dir)

        # データ読み込み
        df = pd.read_csv(csv_file)

        # 統計処理
        stats = calculate_statistics(df)

        # 結果保存
        save_structured_data(stats, divided_dir)

フォルダモードの活用

複合データ処理
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
def process_experiment_folders(srcpaths, resource_paths):
    # フォルダモード: 関連ファイル群を統合処理
    for divided_dir in get_divided_directories():
        files = get_all_files(divided_dir)

        # ファイル種別の識別
        data_file = find_file_by_extension(files, '.csv')
        config_file = find_file_by_extension(files, '.json')
        image_file = find_file_by_extension(files, '.png')

        # 統合処理
        result = process_experiment_set(data_file, config_file, image_file)

        # 結果保存
        save_integrated_result(result, divided_dir)

トラブルシューティング

よくある問題と解決方法

期待したモードで処理されない

モード確認
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def check_processing_mode(zip_path):
    with zipfile.ZipFile(zip_path, 'r') as zip_file:
        file_list = zip_file.namelist()

        print("ZIPファイル内容:")
        for name in file_list:
            print(f"  {name}")

        # モード判定結果
        mode = determine_excel_invoice_mode(zip_path)
        print(f"判定されたモード: {mode}")

ファイルが見つからない

ファイル存在確認
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def verify_file_structure(divided_dir):
    raw_dir = Path(divided_dir) / "raw"

    if not raw_dir.exists():
        print(f"❌ rawディレクトリが存在しません: {raw_dir}")
        return False

    files = list(raw_dir.glob("*"))
    print(f"rawディレクトリ内のファイル数: {len(files)}")

    for file in files:
        print(f"  - {file.name}")

    return len(files) > 0

デバッグのヒント

問題 確認項目 解決方法
モード判定エラー ZIP構造 ZIPファイル内容を確認
ファイル不足 divided/00xx/raw/ ファイル展開を確認
処理エラー ログファイル data/logs/rdesys.log を確認

まとめ

ファイルモードとフォルダモードの特徴:

  • 自動判定: ZIP構造に基づく自動モード選択
  • 柔軟性: 多様な入力形式への対応
  • 効率性: 大量データの一括処理
  • 透明性: 明確な処理ルールと予測可能な結果

次のステップ

ExcelInvoice処理をさらに活用するために、以下のドキュメントを参照してください: