Skip to content

[C03] A single non-UTF-8 file aborts the entire /admin/analyze run, skipping valid UTF-8 files in the same prefix #8

@ogawsh

Description

@ogawsh

[C03] /admin/analyze は 1 ファイルが非 UTF-8 だと analyze 全体を中断し、他の正常 UTF-8 ファイルも無視してしまう

再現条件

  • 同一プレフィックスに UTF-8 ファイルと非 UTF-8 ファイル(例: CP932 / Shift_JIS)が混在
  • Admin UI で /admin/analyze 実行

観測された挙動

  • _group_csv_by_header でグルーピングされた代表ファイルが非 UTF-8 だった場合(たまたま先頭に来た CP932 ファイルなど)、_detect_encodingUnicodeDecodeError を上げて処理全体が return
  • Admin UI には次のエラーが表示される:
    CSV分析エラー: UTF-8 以外のエンコーディングが検出されました:
    testcase/C03-realestate-bom-cp932/properties_cp932.csv。CSV は UTF-8 で保存してください。
    
  • 他の正常な UTF-8 ファイル(properties_utf8.csvproperties_utf8_bom.csv 等)はまったく analyze されず、利用者側はどのファイルが問題だったかを 1 ファイル分しか知ることができない

原因

lambda/adminwebbackend/app.py の analyze 本体:

for idx, group in enumerate(groups, 1):
    ...
    info = _analyze_csv_file(CSV_BUCKET_NAME, representative_key)
    if "error" in info:
        error_msg = info["error"]
        if "UTF-8 以外" in error_msg:
            logger.error("analyze: エンコーディングエラー %s: %s", representative_key, error_msg)
            yield _sse("error", {"message": error_msg})
            return   # ← ここで全 group の処理を打ち切る
        errors.append(...)
        continue       # ← 他のエラー種別は continue で他グループを続ける
  • 他のエラー(CSV 読み取り失敗 等)は continue で別グループを処理するのに、UTF-8 エラーだけは return即全停止
  • _detect_encoding は各グループの 代表 1 ファイルしか見ないため、グループ内の他ファイルが非 UTF-8 でもそちらは検出できず、COPY 段階で Invalid UTF8 character 系のエラーになる(= 代表の運によって挙動が変わる)

期待される挙動

  • 1 ファイルの encoding エラーで analyze 全体を止めない。他のグループは処理を続けて、結果にまとめて「このファイルは非 UTF-8 のため除外した」と報告する
  • Admin UI の analyze プレビュー画面で、非 UTF-8 ファイルだけを除外した状態でテーブル定義を提示し、利用者が「このファイルを再アップロードしますか」「除外したまま進めますか」を選べるようにする
  • 代表 1 ファイルだけでなく、グループ内の他ファイルにも簡易的な encoding チェックをかける(または少なくとも「このグループの他ファイルは未検証」と警告する)

再現手順

  1. 同一スキーマの CSV を 3 ファイル用意
    • properties_cp932.csv(CP932 エンコード)
    • properties_utf8.csv(UTF-8)
    • properties_utf8_bom.csv(BOM 付き UTF-8)
  2. 同一 S3 プレフィックスに配置
  3. Admin UI で analyze を実行
  4. _detect_encoding が CP932 ファイルを検出して analyze 全体が中断し、残り 2 ファイルは無視されることを観測

参考情報

  • 対象スタック: arn:aws:cloudformation:ap-northeast-1:411521242467:stack/stagingDwhAgentStack/6d94b460-4105-11f1-a522-0e470ca459d5
  • 関連ファイル: lambda/adminwebbackend/app.py の analyze generator, _detect_encoding, _analyze_csv_file

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions