Modelerの可変長ファイルノードを、pythonに書き換えてみます。ここでは、以下の5つのオプションについてフォーカスします。
Modelerでチェックを入れた場合:
入力ファイルの1行目がヘッダーとみなされ、フィールド名として、取得されます。
Modelerでチェックを外した場合:
入力ファイルの1行目もデータとみなされます。フィールド名としては、fieldnが割り当てられます。
注)通常、ヘッダーのないファイルに対してチェックを外しますが、ここでは比較のため、ヘッダーのあるファイルに対してチェックを外しています。
#####Pythonでの書き換え
pandasの関数read_csv()で、なにも引数を設定しないと、1行目がheaderとして認識され、列名columnsに割り当てられます。
header=Noneとすると、列名columnsに連番が割り当てられます。
列名を明示的に指定したい場合は、namesオプションを使います。0行目は旧列名が入っていますので、その行は読み込まないようにskiprowsオプションを付けました。
Modelerでは、ストリームのデフォルト、システムデフォルト、UTF-8を選択することができます。ストリームのデフォルトでは、以下の画面に示すストリームのオプションで設定したエンコードが利用されます。
ここでは、windows環境で、テスト用にshift_jisのファイルを用意しました。
天気,気温
晴れ,30
曇り,25
雨,20
ストリームのデフォルトでシステムデフォルトを設定した状態で、ストリームのデフォルトを選択した場合、shift_jisのファイルが正しく表示されます。
次に少し特殊な文字を表示させてみます。
天気,気温
晴れ,30
曇り,25
雨,20
凜,
㌧,
髙,
㈱,
①,
注)LinuxやMacのシステムデフォルトはshift_jisではありません。上述の通り、ModelerではシステムデフォルトかUTF-8しか選択できませんので、shift-jisのファイルを扱う際には事前に文字コードの変更などが必要です。
#####Pythonでの書き換え
エンコーディングは引数encodingで指定します。デフォルトはutf-8で、shift_jisやcp932などを指定できます。
異なるエンコーディングのファイルに対しては、文字化けするのではなく、エラーUnicodeDecodeErrorになります。
encoding="shift_jis" を指定すると、正しく表示されます。
次に、少し特殊な文字ですが、エンコードでshift_jisを指定すると、UnicodeDecodeError となりました。cp932を指定することで、Modeler同様、Pythonでも問題なく出力されることが確認できました。
Modelerのデフォルトでは、カンマと改行にチェックが入っています。ここでは、以下のデータを用いて、動作を確認してみます。
天気,気温
晴れ,30
曇り
雨,20
デフォルトの設定では、改行もフィールド区切り文字と設定されているため、フィールド区切り文字として扱われ、以下のように出力されてしまいます。
改行を“行区切り”として扱いたい場合、「行区切り文字は改行文字です」にチェックを入れます。これで、期待通りの出力となりました。
次に、区切り文字として使われることが多い | を使ったデータを試してみます。
天気|気温
晴れ|30
曇り
雨|20
この場合、その他のところに | を入力して、フィールド区切り文字として指定します。期待通りの出力となりました。
#####Pythonでの書き換え
Pandasの関数read_csv()では、改行は”行区切り”として扱われ、特にオプションの指定はせずに期待通りの出力となりました。
次に区切り文字として | を使ったデータです。read_csv()では、区切り文字の指定は、sepオプションを利用します。
すでに以下の記事で紹介してくださっていますので、ここでの説明は省略します。
[SPSS Modelerの日付関連clem関数をPythonで書き換える。][]
[SPSS Modelerの日付関連clem関数をPythonで書き換える。]:https://qiita.com/kawada2017/items/c41f443e5246d331bea1
デフォルトでは、ペアで破棄 が選択されています。この場合、フィールド値は文字列として、引用符なしで保存されます。ここでは、引用符の中に , や改行が含まれるデータで、動作を確認してみます。
天気,気温,コメント
晴れ,30,"すごしやすい 天気,気温 です”
曇り
雨,20,"蒸し暑い
天気です"
一見、期待通りの出力が得られたように見えますが、引用符中の改行が半角スペースとして表示されました。「蒸し暑い 天気です」となっていますが、このデータをそのまま出力させると、改行されて出力されましたので、内部的には改行コードのまま扱われているようです。
#####Pythonでの書き換え
関数read_csv()でもデフォルト(特にオプションの指定なし)で、引用符は破棄され、引用符なしの文字列として出力されました。ただし、文字列の中で、引用符中の改行は、\r\nとして扱われています。\r\n が不要な場合には、置換する必要があります。ここでは、関数replace()を使用して、\r\nを削除してみました。
##(参考にした情報)
[pandasでcsv/tsvファイル読み込み(read_csv, read_table)][]
[pandasでcsv/tsvファイル読み込み(read_csv, read_table)]:https://note.nkmk.me/python-pandas-read-csv-tsv/
[Python♪Windowsの「Shift JIS」の落とし穴][]
[Python♪Windowsの「Shift JIS」の落とし穴]:https://snowtree-injune.com/2020/05/15/codec-py003/