From ecbff882bf2819e0d56edf452522596be5fb9168 Mon Sep 17 00:00:00 2001 From: "x.azuma.m@nds-tyo.co.jp" Date: Thu, 13 Jul 2023 15:41:38 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=90=E3=82=B0=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BOM3byte目の0xBFを判定するとき、UTF-8バイトシーケンスに含まれる0xBFを誤検知して、正しく末尾行が抽出できなかった --- .../src/batch/vjsk/vjsk_data_load_manager.py | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py index 0cc8a248..11764edf 100644 --- a/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py +++ b/ecs/jskult-batch-daily/src/batch/vjsk/vjsk_data_load_manager.py @@ -91,26 +91,14 @@ class VjskDataLoadManager: # memo: UTF-8 バイトシーケンスとして、b'\n' が全角文字の一部にはならない if char == b'\n': break - # ファイル先頭のBOMを検出したらループ終了 - if char == b'\xbf': + # ファイル先頭のBOM3byte目の BF を検出したらループ終了 + # memo: UTF-8 バイトシーケンスとして、b'\xbf' が全角文字の一部の可能性がある(例:全角片仮名の「タ」) + # memo: charに代入したときのfile.read(1)によって、ファイルポインタは2→3になっている前提のロジック + if char == b'\xbf' and file.tell() == 3: break last_line = file.readline().decode('utf-8-sig').rstrip('\n') buf_count = last_line.count('\t') - # # ファイルの末尾から2バイト手前に、シーク位置を移動 - # # memo: 1byte戻るだけだと、直後のread(1)で末尾行のLFを見てしまうので、-2移動 - # file.seek(-2, os.SEEK_END) - # # 改行文字を見つけるまで逆方向に読み進める - # # memo: read(1)することでシーク位置は1byte前に進む - # while file.read(1) != b'\n': - # # シーク位置を1バイト戻って再度読み込み - # # memo: read(1)でシーク位置が1byte進んでいるので、その戻しと合わせて-2移動 - # file.seek(-2, os.SEEK_CUR) - # # 末尾行を抽出 - # last_line = file.readline().decode().rstrip('\n') - # # 末尾行に含まれるタブ文字の数を抽出 - # buf_count = last_line.count('\t') - return buf_count @classmethod