Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

• • • • • • • •

Slide 3

Slide 3 text

• • • • • 次(予定) 今

Slide 4

Slide 4 text

• • fopen fgetcsv fputcsv • SplFileObject • league/csv •

Slide 5

Slide 5 text

• • • • • SplFileObject fgetcsv fputcsv league/csv • fw3/stream

Slide 6

Slide 6 text

• • • • SplFileObject fgetcsv • league/csv

Slide 7

Slide 7 text

• https://packagist.org/packages/fw3/streams • https://packagist.org/packages/fw3_for_old/streams • • • • • https://github.com/wakabadou/phperkaigi2021

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

• • f(?:get|put)csv • • • mb_convert_encoding • • •

Slide 10

Slide 10 text

• fgutcsv fputcsv SplFileObject league/csv

Slide 11

Slide 11 text

• composer require fw3/streamsとしてfw3/streamsを インストールします • 次の例のようにstream filterを登録します ※ 同一リクエスト内で一度だけ登録すればOKです • 後は必要なクラスをuseし、無名関数の中でSpecクラスを用いて SplFileObjectなどでCSVを処理すればOKです

Slide 12

Slide 12 text

• 環境や案件により、ComposerやAutoloaderが使えない場合もあります • その場合は、fw3-for-old/streamsを使用してください • https://github.com/fw3-for-old/streams を開き”Code”ボタンを押下 ”Download ZIP”からアーカイブをダウンロードしてください • ダウンロードしたアーカイブを任意のディレクトリに展開してください • アーカイブ内のsrc/filters_require_once.phpを読み込みます require_once sprintf(‘%s/src/filters_require_once.php’, $path_to_copy_dir); として読み込んでください • 以降はuseで指定する名前空間のベンダー名をfw3からfw3_for_oldに変更すれば fw3/streamsを使って解決(事前準備)と同じ手順を適用できます Specで記述した内容を 文字列として展開 ここを置き換えます

Slide 13

Slide 13 text

• fw3/streamsを使って解決(事前準備)を行った上で次の記述を行います • StreamFilterSpec::decorateForCsv()メソッドを利用して実行前後に必要な処理を自動適用、 確実に動作させます • 後はSpecクラスで変換する内容を定義して、SplFileObjectクラスなどいつも通りの CSV書き込み処理を記述するだけでOKです • !!注意!! この無名関数の中からyieldで返すことはできません •

Slide 14

Slide 14 text

Specによる設定 Specで記述した内容を 文字列として展開 後は”いつも通りの処理”をするだけ

Slide 15

Slide 15 text

• SpecクラスはStreamFilter用設定文字列を返すため、SplFileObjectに限らず、fputcsv関数やleague/csvでもその ままシームレスに利用できます。 • SplFileObjectの場合 • fputcsvの場合 • league/csvの場合 同一の記述でOK 同一の記述でOK 同一の記述でOK

Slide 16

Slide 16 text

• 現場都合で無名関数を使えないケースもあります • その場合は実行前後に必要な処理を手動で記述するだけでOKです

Slide 17

Slide 17 text

実行前に必要な設定 実行後に必要な設定 事前にフィルタ登録 登録済みの場合は不要です 前のページにもあった ”いつも通りの処理” 無名関数を用いたサンプルと同じ処理 無名関数版では緑色領域の 内容をクロージャーの前後で 自動実行しています。

Slide 18

Slide 18 text

• CSV書き込みと同様、fw3/streamsを使って解決(事前準備)を行った上で次の記述を行います • StreamFilterSpec::decorateForCsv()メソッドを利用して実行前後に必要な処理を自動適用、 確実に動作させます • 後はSpecクラスで変換する内容を定義して、SplFileObjectクラスなどいつも通りの CSV読み込み処理を記述するだけでOKです • 無名関数の返り値をそのまま呼び出し元で受け取る事ができます • !!注意!! この無名関数の中からyieldで返すことはできません •

Slide 19

Slide 19 text

Specによる設定 Specで記述した内容を 文字列として展開 後は”いつも通りの処理”をするだけ 返り値として 受け取れます 返り値として 受け取れます

Slide 20

Slide 20 text

• SpecクラスはStreamFilter用設定文字列を返すため、SplFileObjectに限らず、fgutcsv関数やleague/csvでもその ままシームレスに利用できます。 • SplFileObjectの場合 • fputcsvの場合 • league/csvの場合 同一の記述でOK 同一の記述でOK 同一の記述でOK

Slide 21

Slide 21 text

• 現場都合で無名関数を使えないケースもあります • その場合は実行前後に必要な処理を手動で記述するだけでOKです

Slide 22

Slide 22 text

実行前に必要な設定 実行後に必要な設定 事前にフィルタ登録 登録済みの場合は不要です 前のページにもあった ”いつも通りの処理” 無名関数版では緑色領域の 内容をクロージャーの前後で 自動実行しています。 無名関数を用いたサンプルと同じ処理

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

• • https://www.php.net/manual/ja/stream.filters.php • • 詳しくは技術評論社から発売中の 『みんなのPHP 現場で役立つ最新ノウハウ!』 第7章 厳選! PHP活用テクニック紹介 ストリームフィルタを用いた透過的なCSV入出力 をご参照ください

Slide 25

Slide 25 text

Spec • • • • • • •

Slide 26

Slide 26 text

• SplFileObject fgetcsv fputcsv • • •

Slide 27

Slide 27 text

• •

Slide 28

Slide 28 text

• •

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

• explode implode • fgutcsv fputcsv SplFileObject • file_get_contents file_put_contents • fread fwite • popen • iconv • league/csv

Slide 31

Slide 31 text

explode implode • file_get_contents explode • implode file_put_contents

Slide 32

Slide 32 text

explode implode

Slide 33

Slide 33 text

explode implode • • • • しません •

Slide 34

Slide 34 text

explode implode • • • つらくきびしいげんじつ

Slide 35

Slide 35 text

fgutcsv fputcsv SplFileObject • fgutcsv fputcsv SplFileObject • •

Slide 36

Slide 36 text

fgutcsv fputcsv SplFileObject

Slide 37

Slide 37 text

fgutcsv fputcsv SplFileObject • • • • 0x5C • “同”“ソ” 213 ��“�¥”,213 • • CSVと直接関係はないですが「ポ」など 2バイト目が0x7C (|)な文字が含まれた事で コマンドのパイプが成立する話もあります

Slide 38

Slide 38 text

fgutcsv fputcsv SplFileObject • fgutcsv fputcsv SplFileObject • ja_JP.UTF-8 en_US.UTF-8

Slide 39

Slide 39 text

fgutcsv fputcsv SplFileObject • setlocale

Slide 40

Slide 40 text

fgutcsv fputcsv SplFileObject • • OSにインストールされている • locale -a • Japanese_Japan.932 • • • • setlocale setlocale

Slide 41

Slide 41 text

fgutcsv fputcsv SplFileObject • • OSにインストール • setlocale • setlocale • • setlocale •

Slide 42

Slide 42 text

fgutcsv fputcsv SplFileObject

Slide 43

Slide 43 text

file_get_contents file_put_contents • 新規にインストール • • mb_convert_encoding

Slide 44

Slide 44 text

file_get_contents file_put_contents • •

Slide 45

Slide 45 text

file_get_contents file_put_contents • •

Slide 46

Slide 46 text

fread fwite • file_get_contents file_put_contents • fread fwrite • fgutcsv

Slide 47

Slide 47 text

fread fwite

Slide 48

Slide 48 text

fread fwite • • 実用するべきではありません •

Slide 49

Slide 49 text

• • fread fwite • 実用するべきではない fread fwite

Slide 50

Slide 50 text

popen • -r runオプション fgetcsv •

Slide 51

Slide 51 text

popen

Slide 52

Slide 52 text

popen • • • • • •

Slide 53

Slide 53 text

popen •

Slide 54

Slide 54 text

iconv • • fgetcsv fputcsv SplFileObject league/csv •

Slide 55

Slide 55 text

iconv

Slide 56

Slide 56 text

iconv •

Slide 57

Slide 57 text

iconv • • iconv • 8.0.2-cli-alpine • • 行が無かったことになるだけで、処理は続行されます • • •

Slide 58

Slide 58 text

iconv • iconv • • • •

Slide 59

Slide 59 text

league/csv • • • mb_convert_encoding iconv filter

Slide 60

Slide 60 text

league/csv

Slide 61

Slide 61 text

league/csv •

Slide 62

Slide 62 text

league/csv • • • SplFileObject Stream::getCurrentRecord() fgetcsv fgutcsv fputcsv SplFileObject • Q:pull request出してあげたら? A:league/csv自体の手触りを変えずに 実現する方法が思いつかない

Slide 63

Slide 63 text

league/csv • https://github.com/thephpleague/csv/issues/339 league/csv • fgutcsv fputcsv SplFileObject

Slide 64

Slide 64 text

• explode implode • • fgutcsv fputcsv SplFileObject • • file_get_contents file_put_contents • • • fread fwite • 可及的速やかに別の手段を検討しましょう

Slide 65

Slide 65 text

• popen • • • iconv • 可及的速やかに別の手段を検討しましょう • league/csv •