比較的使い慣れているPHPで、csvを編集 → file_put_contents()で保存したい。それをwindows上でやりたい!
カンタンにできると思いきや、エラーにはまって悪戦苦闘したので、注意点などをメモしておきます。
今回実行したかったのは以下のPHPです!
失敗①
1 2 3 4 5 6 7 8 9 |
<?php $ato = ''; $datas=file('moto.csv'); foreach ($datas as $data) { $line=explode(",",$data); //ここでCSVを編集してごにょごにょする } file_put_contents("ato.csv", $ato); ?> |
このプログラム、windows上ではなく、レンタルサーバー上なら全く問題なく動きます。でもローカル環境だと以下のエラーが出てきます。
Warning: file(moto.csv): failed to open stream: No such file or directory in ….
う~ん・・・
とりあえず相対パスではなく、絶対パスにしたらどうにかなるんじゃ??と軽い気持ちで以下のように訂正。
失敗②
1 2 3 4 5 6 7 8 9 |
<?php $ato = ''; $datas=file('C:\test\moto.csv'); foreach ($datas as $data) { $line=explode(",",$data); //ここでCSVを編集してごにょごにょする } file_put_contents("C:\test\ato.csv", $ato); ?> |
が・・・。
またもエラー($・・)/~~~
Warning: file_put_contents(C: est\ato.csv): failed to open stream: Invalid argument in ….
なぜーーーΣ(゚д゚lll)
と思いながらgoogle先生に尋ねてみると
Windows 環境では、ファイルパスで用いる全てのバックスラッシュを エスケープするかフォワードスラッシュを使用することに注意してください。
PHPマニュアル
“c:\\folder\\resource.txt” ← こんな風に書かないといけないらしい。。。
\と¥は同じです。たぶん。
というわけで、
windows上でfile_put_contentsに成功!
1 2 3 4 5 6 7 8 9 |
<?php $ato = ''; $datas=file('C:\\test\\moto.csv'); foreach ($datas as $data) { $line=explode(",",$data); //ここでCSVを編集してごにょごにょする } file_put_contents("C:\\test\\ato.csv", $ato); ?> |
無事、実行することができました。
C\:xampp\php\php.exe “C:\test\test.php”
とコマンドに打ち込み実行しました。
追記
成功したと思ったのも束の間、またも、はまりました。。。
原因はmoto.csvをSHIFT-JISで保存してしまっていたことでした。UTF-8で保存すれば、うまく実行できるのですが、それに気付くのに半日費やしました(+o+)
蛇足
ちなみに、今回やりたかったのは、以下。
☆住所のCSVファイル → 経度,緯度,一致レベルのCSVファイルを作成
具体的には以下のような感じです。
1 2 3 |
兵庫県神戸市東灘区魚崎中町4丁目 兵庫県神戸市東灘区魚崎中町3丁目 兵庫県神戸市東灘区深江北町3丁目 |
↓↓↓
1 2 3 |
135.26954033,34.71286443,6 135.27188729,34.71548919,6 135.29220736,34.72382744,5 |
その時の利用したPHPが以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php function get_ido_keido($address){ //緯度・経度情報が配列で返ります。※array('緯度','経度','AddressMatchingLevel') $appid='ごにょごにょごにょ(*ノωノ)'; //appidはyahooAPIに登録すれば無料でもらえます。 header('Content-type:text/html;charset=UTF-8'); $xml_file='http://geo.search.olp.yahooapis.jp/OpenLocalPlatform/V1/geoCoder?recursive=true&appid='.$appid.'&query=' . $address; $xml=simplexml_load_file($xml_file,'SimpleXMLElement', LIBXML_NOCDATA); if($xml->ResultInfo->Count>0){ $ido_keido=$xml->Feature[0]->Geometry->Coordinates; $ido_keido=explode(',',$ido_keido); $ido_keido[2]=intval($xml->Feature[0]->Property->AddressMatchingLevel); return $ido_keido; }else{ return false; } } $ato = ''; $datas=file('C:\test\moto.csv'); foreach ($datas as $data) { $line=explode(",",$data); $address=$line[0]; $ido_keido=get_ido_keido($address); $ato .= $ido_keido[0].",".$ido_keido[1].",".$ido_keido[2]."\n"; } file_put_contents("C:\\test\\ato.csv", $ato); ?> |
YahooAPIを利用して住所から緯度・経度・一致レベルを一覧にしてCSVにしたかったんですよねーー。
意外に苦労してしまいました。
コメント