※当サイトの記事には、広告・プロモーションが含まれます。

シェルスクリプトでShift-JISのCSVファイルのヘッダー行を判定するには

gigazine.net

ただし、法執行機関による公共の場での生体認証技術の利用は完全には禁止されず、厳密に定義された犯罪リストに対してはAIの利用が許可されます。具体的には「重大な犯罪を犯した疑いのある人物、あるいは有罪判決を受けた人物に対象を絞った捜査」では、AIテクノロジーの使用が許可されます。

世界初のAI規制法にEUが合意、政策執行機関の委員長は「世界初のAI法」であることを強調 - GIGAZINE

生体認証システムでAIを利用可能となる具体的なケースは以下の通り。

・被害者に的を絞った捜索(誘拐、人身売買、性的搾取)
・特定のテロリズムの脅威の防止
・規制に記載されている特定の犯罪(テロリズム、人身売買、性的搾取、殺人、誘拐、強姦、武装強盗、犯罪組織への参加、環境犯罪など)のいずれかを犯した疑いのある人物の特定あるいは位置特定

世界初のAI規制法にEUが合意、政策執行機関の委員長は「世界初のAI法」であることを強調 - GIGAZINE

さらに、高リスクに分類されたAIシステム(健康、安全、基本的権利、環境、民主主義、法の支配に重大な害を及ぼす可能性があるもの)について、明確な義務が課せられることとなっています。欧州議会は「他の要件の中でも特に、保険および銀行セクターに適用される必須の基本的権利影響評価を含めることに成功しました」と説明しました。また、「選挙の結果や有権者の行動に影響を与えるために使用されるAIシステム」も、高リスクAIシステムに分類されるそうです。国民は高リスクAIシステムに分類されたAIに対して苦情を申し立てたり、国民の権利に影響を与えるリスクの高いAIシステムに基づく決定について説明を受けたりすることが可能です。

世界初のAI規制法にEUが合意、政策執行機関の委員長は「世界初のAI法」であることを強調 - GIGAZINE

⇧う~む、犯罪組織を撲滅する用途として普及するのは喜ばしいところですが、特定の機関が支配的にならないように、監視する中立な機関が必要そうですかね。

Linux文字コードUTF-8が標準?

ネットの情報だと、

www.baeldung.com

unix.stackexchange.com

⇧ localeコマンドで確認できるってことなんかね?

確認してみました。

UTF-8となってますな。

シェルスクリプトでShift-JISのCSVファイルのヘッダー行を判定するには

で、日本特有の問題なのかもしれんけど、文字コード

のファイルが混在することあるあるだと思いますと。特に、行政が公開してるCSVファイルとかは、文字コードがShift-JISとか利用されてるケースが多いイメージ。

何が困るって、文字コードがShift-JISのCSVファイルの列(カラム)の値が日本語だと漏れなく文字化けが起こるというね...

つまり、文字コードがShift-JISのCSVファイルの1行目のヘッダー行の列(カラム)名が日本語とかになっていると、文字化けのせいでヘッダー行の判定が上手くいかないんですな...

そもそもとして、ネットの情報だと、1行目がヘッダー行である前提の話しか無いので、ヘッダー行の有無の判定については無頓着なんですな...

何故、暗黙的に1行目が必ず正確なヘッダー行であると確定した前提になっていることに対して疑問を抱かないのか不思議だ...

気を取り直して、

lanchesters.site

www.ninton.co.jp

www.wakuwakubank.com

⇧ 上記サイト様によりますと、Shift-JISの文字コードになっているファイルをUTF-8文字コードのファイルに変換できるらしい。

なので、CSVファイルのヘッダー行で列(カラム)名に日本語を含む場合も考慮したヘッダー行の有無判定ができそう。

で、残念ながら、nkfコマンドはLinux標準の機能ではないっぽい...

■/home/ts0818/work/test_header/check_hedaer.sh

#!/bin/bash

# ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
# ■  関数
# ■    ヘッダー行の有無をチェック
# ■  引数
# ■    param $1 CSVファイルの1行目
# ■  戻り値
# ■    0:ヘッダー行あり
# ■    1:ヘッダー行なし
# ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
#function check_header_row(){
function check_header_row(){
  local _CORRECT_HEADER_COLUMN_ARR=("日本語" "英語")
  local _first_row="$1"
  local _first_row_arr=(${_first_row//,/ })
  
  #echo '[_CORRECT_HEADER_COLUMN_ARR]'"${_CORRECT_HEADER_COLUMN_ARR[@]}"
  #echo '[_first_row_arr]'"${_first_row_arr[@]}"
  
  # ヘッダー行の列(カラム)の数をチェック
  if [[ "${#_CORRECT_HEADER_COLUMN_ARR[@]}" -ne "${#_first_row_arr[@]}" ]]; then
    #echo "length not match"
    # ヘッダー行は存在しない
    echo 1
    return

  fi
  
  # ヘッダー行の列(カラム)の数だけ繰り返し
  for column_idx in ${!_CORRECT_HEADER_COLUMN_ARR[@]}
  do
    correct_column=$(echo -n "${_CORRECT_HEADER_COLUMN_ARR[${column_idx}]}")
    file_column=$(echo -n "${_first_row_arr[${column_idx}]}")
    
    # 列(カラム)名が異なっている場合
    if [[ "${file_column}" != "${correct_column}" ]]; then
      #echo '${_first_row_arr[${column_idx}]}'"${_first_row_arr[${column_idx}]}"
      #echo '${_CORRECT_HEADER_COLUMN_ARR[${column_idx}]}'"${_CORRECT_HEADER_COLUMN_ARR[${column_idx}]}"
      # ヘッダー行は存在しない
      echo 1
      return
    fi
  
  done
  
  # ヘッダー行が存在する
  echo 0

}

# ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
# ■  メイン処理
# ■
# ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
readonly TARGET_DIR=/home/ts0818/work/test_header/data
readonly ENCODING_UTF8=utf-8

tmp_file_csv=tmp_file.csv
first_row=""

# 対象のファイルが存在する
for file in $(\find ${TARGET_DIR} -maxdepth 1 -name '*.csv')
do

  # ファイルの文字コード判定
  #file_encoding=$(nkf -g ${file})
  file_encoding=$(file -i ${file} | awk '{print $3}' | awk -F'=' '{print $2}')
  echo '[file_encoding]'"${file_encoding}"

  # ファイルの文字コードがUTF-8以外の場合
  if [[ "${file_encoding}" != "${ENCODING_UTF8}" ]]; then
    #nkf -wd ${file} > ${tmp_file_csv}

    # 文字コードUTF-8で一時ファイルに書き込み
    iconv -f SJIS -t UTF-8 ${file} > ${tmp_file_csv}
    # 1行目を取得(改行コードは削除)
    first_row=$(head -n 1 "${tmp_file_csv}" | tr -d '\r' | tr -d '\n')
  
  # ファイルの文字コードがUTF-8の場合
  else
    # 1行目を取得(改行コードは削除)
    first_row=$(head -n 1 "${file}" | tr -d '\r' | tr -d '\n')
  
  fi
  
  # ファイルが空の場合
  if [[ "${first_row}" = "" ]]; then
    echo "[file empty]${file}"
    continue

  fi

  # ヘッダー行有無のチェック
  is_header=$(check_header_row "${first_row}")
  
  echo '[is_header]'"${is_header}"
  
  # ヘッダー行あり
  if [[ "${is_header}" = "0" ]]; then
    echo "[header exist]${file}"
  
  # ヘッダー行なし
  else
    echo "[header not exist]${file}"

  fi
  
  # 一時ファイルを削除
  rm -f "${tmp_file_csv}"

done

⇧ で、文字コードの異なるCSVファイルを配置しておいて、

実行すると、

⇧ ヘッダー行の有無を判定できていそうです。

改行コードの削除については、

linux.just4fun.biz

⇧ 上記サイト様を参考にさせていただきました。

何と言うか、ただ、ヘッダー行の有無を確認したいだけなのに、シェルスクリプトだとかなり苦肉の策的な手段にならざるを得ないの何とかならんもんか...

英語だと、こんな苦労をしないので済むと思われるから、英語以外の言語を扱う国は四苦八苦する感じなんかね...

それにしても、何か、もっと良い方法はありそうな気はするんだが、ネット上に情報が無いから、分からん...

シェルスクリプト相変わらず、カオスだ...

毎度モヤモヤ感が半端ない...

今回はこのへんで。