フィールド名(列名)をCSVファイルで指定して一括変更する(SPSS Modeler データ加工逆引き7-22)

# フィールド名(列名)をCSVファイルで指定して一括変更する

![{FFBF2E70-701A-47FF-A66C-830AE33A337C}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f5e50ee0-ee4b-49b3-a1cc-97d1d201578b.png)


## 1.想定される利用目的

・列名のないデータの列名定義
・略語や英語の列名のわかりやすい日本語列名への変換

## 2.サンプルストリームのダウンロード
サンプルストリーム

https://github.com/hkwd/spssmodelerscript/raw/refs/heads/master/250619ChangeFieldName/ChangeFieldname.str

サンプル列名定義CSV

https://github.com/hkwd/spssmodelerscript/blob/master/250619ChangeFieldName/fieldDefinition.csv

## 3.サンプルストリームの説明

![{9D98BC7D-CD0A-462B-9E68-AFD3964EB21B}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/63d1fd21-9364-4303-a461-c1b230a0bf43.png)

a.入力するデータは以下の通りです。fieldXXという列名で定義されていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c720d424-7b68-49a2-be76-b10866b968ea.png)

b.[フィルター]ノードをつなぎます。デフォルトでは列名はそのままです。この設定をスクリプトで変更していきます。
![{9D8BDCDF-DEE3-4B2D-9AB6-BB848BE7161D}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a5384209-bc10-4bc2-9751-9d6dc37f0532.png)

注釈タブにうつって、ノードのIDをクリップボードにコピーしてメモして、閉じておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/23a8f75d-f8d3-4043-983e-598d25b17606.png)

Excelなどで列名を定義を定義したCSVをUTF-8のエンコーディングで保存しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/969b3154-4c3c-4770-87a7-0a388872feb0.png)


デフォルトではシフトJISで保存されてしまうので、保存の際に「その他のオプション」を選び、「CSV UTF-8（コンマ区切り）(*.csv)」で保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ae1d887e-7e88-40ec-93d6-d301805cd335.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c5f831eb-f745-4889-a7eb-8c02faed6710.png)

Modelerの「ツール」＿「ストリームのプロパティー」＿「実行」を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4e84d088-cd02-4aab-b2b3-da64ade0a807.png)


csv_file_pathに列定義をしたCSVファイルのパスを設定し、
node=stream.findByIDに先ほどコピーしたフィルターノードのIDを設定して、以下のスクリプトを入力して実行ボタンを押します。

```python:
stream = modeler.script.stream()
import csv

# CSVファイルのパスを指定
csv_file_path = '<列定義をしたCSVファイルのパス>'
# フィルターノードのIDを指定
node=stream.findByID("＜フィルターノードのID＞")

# BOM定義（UTF-8 BOM）
UTF8_BOM = u'\ufeff'

# CSVファイルを読み込む
with open(csv_file_path, 'r') as f:
    reader = csv.reader(f)    
    for row in reader:
        # 最初の行の最初のセルにBOMが含まれている場合は除去
        if row and row[0].startswith(UTF8_BOM):
            row[0] = row[0].replace(UTF8_BOM, '')
        
        # 各行の1列目の列名を2列目の列名で置き換え
        print row[0].decode('utf-8'), row[1].decode('utf-8')
        node.setKeyedPropertyValue("new_name", row[0].decode('utf-8'), row[1].decode('utf-8'))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7580321b-30c2-4660-9fa4-3953fdd58d0d.png)

以下のようにフィルターノードに変換された列名が設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/052de41b-29e3-45d3-aca3-dfad238c4ccc.png)


## 4.参考情報

#### 　列名を変更する/不要な列を削除する(SPSS Modeler データ加工逆引き7-7) 

https://qiita.com/416nishimaki/items/d036b8952f2de5798c0b


#### [フィルター]ノードで列名を一括変換

https://community.ibm.com/community/user/blogs/yoichiro-nishimaki/2025/01/14/modelertips11

#### [フィルター]ノードを扱った記事

https://qiita.com/kawada2017/items/7e10618edd5e1f3d6ebd

https://qiita.com/416nishimaki/items/52f857c98036d2f44839

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008