file_put_contentsをwindows上&コマンドラインで実行したい!エラーではまったのでメモ

比較的使い慣れているPHPで、csvを編集 → file_put_contents()で保存したい。それをwindows上でやりたい!

カンタンにできると思いきや、エラーにはまって悪戦苦闘したので、注意点などをメモしておきます。

今回実行したかったのは以下のPHPです!

スポンサーリンク

失敗①

<?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 ….

う~ん・・・

とりあえず相対パスではなく、絶対パスにしたらどうにかなるんじゃ??と軽い気持ちで以下のように訂正。

失敗②

<?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に成功!

<?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ファイルを作成

具体的には以下のような感じです。

兵庫県神戸市東灘区魚崎中町4丁目
兵庫県神戸市東灘区魚崎中町3丁目
兵庫県神戸市東灘区深江北町3丁目

↓↓↓

135.26954033,34.71286443,6
135.27188729,34.71548919,6
135.29220736,34.72382744,5

その時の利用したPHPが以下です。

<?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にしたかったんですよねーー。

意外に苦労してしまいました。

コメント

お知らせ

羽織紐を手作りしてます!よろしければご覧ください!
  • 天然石 マグネット式羽織紐 #01 / 着物小物 / ブルーグリーン / 水晶
    天然石 マグネット式羽織紐 #01 / 着物小物 / ブルーグリーン / 水晶
  • 天然石 マグネット式羽織紐 #09 / 着物小物 / グレー / 高品質ルチルクォーツ
    天然石 マグネット式羽織紐 #09 / 着物小物 / グレー / 高品質ルチルクォーツ
  • 天然石 マグネット式羽織紐 #04 / 着物小物 / ネイビー
    天然石 マグネット式羽織紐 #04 / 着物小物 / ネイビー

お知らせ

羽織紐を手作りしてます!よろしければご覧ください!
  • 天然石 マグネット式羽織紐 #01 / 着物小物 / ブルーグリーン / 水晶
    天然石 マグネット式羽織紐 #01 / 着物小物 / ブルーグリーン / 水晶
  • 天然石 マグネット式羽織紐 #09 / 着物小物 / グレー / 高品質ルチルクォーツ
    天然石 マグネット式羽織紐 #09 / 着物小物 / グレー / 高品質ルチルクォーツ
  • 天然石 マグネット式羽織紐 #04 / 着物小物 / ネイビー
    天然石 マグネット式羽織紐 #04 / 着物小物 / ネイビー
タイトルとURLをコピーしました