Class ‘PHPExcel_Writer_csv’ not found

PHP Excelでexcelからcsvへの変換しようと以下のように書くと

set_include_path(get_include_path() . PATH_SEPARATOR . "vendor/phpoffice/phpexcel/Classes/");
include "PHPExcel.php";
include "PHPExcel/IOFactory.php";

$objReader = PHPExcel_IOFactory::createReader('Excel5');
$excel = $objReader->load('csv/edinetlist.xls');

$writer = PHPExcel_IOFactory::createWriter($excel, 'csv');
$writer->save('csv/edinetlist.xls');

なに!?
Class ‘PHPExcel_Writer_csv’ not found in /home/vagrant/equity/vendor/phpoffice/phpexcel/Classes/PHPExcel/IOFactory.php on line 141

githubを見ると、


The Writer names are case-sensitive
so you’d need to specify the Writer name correctly as ‘CSV’ rather than ‘csv’
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, ‘CSV’);

なるほど、以下で上手くいきます。

$writer = PHPExcel_IOFactory::createWriter($excel, 'CSV');

もう一回やってみよう

いろいろ触っていたら、csvは複数のsheetsをサポートしていないとアラートが出たので、手動でsheet2,sheet3を削除してcsvで保存。

ini_set('memory_limit', '512M');

$file = "csv/test.csv";
$file = fopen($file, "r");
echo "<table>";
if($file){
  $i= 0;
  while ($line = fgetcsv($file)) {
  	if($i < 10){
  		echo "<tr><td>".$line[0]."</td>";
  		echo "<td>".$line[1]."</td>";
  		echo "<td>".$line[4]."</td>";
  		echo "<td>".$line[5]."</td>";
  		echo "<td>".$line[9]."</td>";
  		echo "<td>".$line[10]."</td>";
  		echo "<td>".$line[11]."</td>";
  		echo "<td>".$line[12]."</td></tr>";
  	}
    $i++; 
  }
}
echo "</table>";
fclose($file);

あれ? なに。

composerでphpexcelをインストールします。
sudo vi /etc/php.iniで以下に変更。
‘memory_limit’, ‘512M’
‘set_time_limit’, ‘480’

phpexcelでシートを削除して期待するcsvに保存できるかやってみます。

set_include_path(get_include_path() . PATH_SEPARATOR . "vendor/phpoffice/phpexcel/Classes/");
include "PHPExcel.php";
include "PHPExcel/IOFactory.php";

$path = "csv/account.xls";
$excel = PHPExcel_IOFactory::load($path);

$excel->removeSheetByIndex(2);

$writer = PHPExcel_IOFactory::createWriter($excel, 'CSV');
$writer->save('csv/out.csv');

駄目なようなので、別の方法を探します。

Allowed memory size of 134217728 bytes exhausted

5万行くらいあるcsv(上場企業の決算全データ)を処理したいのですが、

走らせたところ
192.168.33.1:50210 [500]: / – Allowed memory size of 134217728 bytes exhausted (tried to allocate 8388608 bytes) in /home/vagrant/equity/index.php on line 4

下記を追加して再度リクエスト

ini_set('memory_limit', '512M');
ini_set('memory_limit', '512M');

$pass = "csv/account.csv";
$data = file($pass, FILE_IGNORE_NEW_LINES);

unset($data[0]);

function cut($item){
    return explode(',', $item);
}
$data = array_map("cut", $data);
foreach ($data as $value){
    $code[]= $value[0];
}

var_dump($code);

ああああああああ、もう駄目だ
嫌になってきた、今日は終了

echo mb_detect_encoding($data); で判定すると、”UTF-8″と表示されるんだが、何故??
UTF-8,UTF-7,ASCII,EUC-JP,eucJP-win,SJIS,SJIS-win,JIS,ISO-2022-JP,Unicode全部あかんやん。
ちくしょー

ログインフォーム

<?php
header("Content-type: text/html; charset=utf-8");

define("ID", "vagrant");
define("PASSWORD", "asdf");

$post_id = @$_POST&#91;"id"&#93;;
$post_password = @$_POST&#91;"password"&#93;;
$val1 = @$_POST&#91;"val1"&#93;;
$val2 = @$_POST&#91;"val2"&#93;;
$val3 = @$_POST&#91;"val3"&#93;;

$mass = $val1 + $val2;

if($post_id == ID && $post_password == PASSWORD && $mass == $val3){
	echo "<p>ログイン成功</p>";
} elseif(!@$_POST){
	login_form();
} else {
	if($mass == $val3){
		echo "<p>ログイン失敗 IDまたはPASSWORDが間違っています。</p>";
	} else {
		echo "<p>ログイン失敗 計算の答えが間違っています。</p>";
	}
	login_form();
}

function login_form(){

	$rand1 = rand(0,9);
	$rand2 = rand(0,9);

	echo <<<LOGINFORM
	<!DOCTYPE html>
	<html lang="ja">
	<body>
	<form action="" method="post" id="login">
		<input type="text" name="id" placeholder="id">
		<input type="password" name="password" placeholder="password">
		<input type="text" name="val1" style="display:none;" value="{$rand1}">
		<input type="text" name="val2" style="display:none;" value="{$rand2}">
		<input type="text" name="val3" placeholder="{$rand1}+{$rand2}=の答えを入力">
		<input type="submit" value="ログイン">
	</form>
	</body>
	</html>
LOGINFORM;
}
?>

パラメータを$_GETで受け取る

echo $_GET["code"];

コードの情報をDBから取得する

$time_start = microtime(true);

$code = empty($_GET["code"])? 'null' : $_GET["code"];
echo $code. "<br>";

$dsn = "mysql:dbname=equity;host=localhost";
$user = "hoge";
$password = "hogehoge";
 
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
} 

$sql = "select * from lists where code = $code";
$stmt = $dbh->query($sql);

$result = $stmt->fetch(PDO::FETCH_ASSOC);
 
echo $result['name']. "<br>";
echo $result['sector']. "<br>";
echo $result['market']. "<br>";

echo "<br>";
$time = microtime(true) - $time_start;
echo "{$time}秒";

OK!

パラメータからデータを読み込む

パラメータを変える

なるほど

取得した時刻が現在より未来か過去か判定する

strtotimeを使ってUNIXタイムスタンプに変換して比較します。

$now = date("Y-m-d H:i:s");
if(strtotime($now) > strtotime($list[10]["dt_txt"])){
	echo "過去の天気です。";
}else if(strtotime($now) <= strtotime($list[10]["dt_txt"])){
    echo "未来の天気です。";  
} else{
	echo "比較に失敗しました。";
}

今より、未来の天気予報を表示する

$now = date("Y-m-d H:i:s");

echo "<table class=\"table1\">";
echo "<tr>";

$i = 1;
foreach($list as $value){
	if(strtotime($now) <= strtotime($value&#91;"dt_txt"&#93;)){
	echo "<td>";
    $date = $value["dt_txt"];
    echo date('n月j日 H時', strtotime($date)). "<br>";
	echo convert($value["weather"][0]["main"]) . "<br>";
	echo "<span style=\"color:gray;\">".convert2($value["weather"][0]["description"]) . "</span><br>";
	$temp = $value["main"]["temp"];
	echo "気温 : " . number_format(($temp - 273.15),1) . "°<br>";
	echo "湿度 : " . $value["main"]["humidity"] . "%<br>";
	echo "雲 : " . $value["clouds"]["all"] . "%<br>";
	echo "風速 : " . $value["wind"]["speed"] . "m<br><br>";
	echo "</td>";
	if($i % 8 == 0){
	echo "</tr><tr>";
	}
	$i++;
	}
	

}
echo "</tr>";
echo "</table>";

なるほど、なかなかいいんじゃないでしょうか?

Yahoo天気
23区全部ありますね。。チ。

天気の英語から日本語への変換

一つづつstr_replaceで変換を考えましたが、

str_replace("Clear","晴れ", $main);

ここではswitch文を使ってみます。

foreach($list as $value){
	$main = $value["weather"][0]["main"];
		switch($main){
			case 'Clear':
				echo "晴れ<img src=\"icon01.png\"><br>";
				break;
			case 'Clouds':
				echo "曇<img src=\"icon02.png\"><br>";
				break;
			case 'Rain':
				echo "雨<img src=\"icon03.png\"><br>";
				break;
			default:
				echo $main;
		}
}

functionにします。

function convert($main){
	switch($main){
			case 'Clear':
				return "晴れ<img src=\"icon01.png\">";
				break;
			case 'Clouds':
				return "曇<img src=\"icon02.png\">";
				break;
			case 'Rain':
				return "雨<img src=\"icon03.png\">";
				break;
			default:
				echo $main;
		}
}

悪くないです。良くもないが。。

descriptionも関数を作ってみます。

function convert2($description){
	switch($description){
			case 'clear sky':
				return "晴天<br>";
				break;
			case 'scattered clouds':
				return "きれぎれに浮かんでいる雲";
				break;
			case 'broken clouds':
				return "ちぎれた雲<br>";
				break;
			case 'few clouds':
				return "少しの雲<br>";
				break;
			case 'light rain':
				return "小雨<br>";
				break;
			default:
				echo $description;
		}
}

日付形式の変換

2018-03-10 09:00:00
3月10日 09時

Y/m/d H:i:s
Y/n/j H:i:s

mはゼロ詰め、nはゼロつめなし。
dはゼロ詰め、jはゼロつめなし。

echo date('n月j日 h時', strtotime($date));

あれ、15時が03時になってますね。駄目ですね。

H大文字だと、15時、18時、21時と表示されました。

date('n月j日 H時', strtotime($date))

setCookie

<p>setCookie</p>
<script>
function setCookie(c_name,value,expiredays){
	var path = location.pathname;
	var paths = new Array();
	paths = path.split("/");
	if(paths[paths.length-1] != ""){
		paths[paths.length-1] = "";
		path = paths.join("/");
	}
	var extime = new Date().getTime();
	var cltime = new Date(extime + (60*60*24*1000*expiredays));
	var exdate = cltime.toUTCString();
	var s = "";
	s += c_name +"="+ escape(value);
	s += "; path="+path;
	if(expiredays){
		s += "; expires=" +exdate+"; ";
	} else {
		s += "; ";
	}
	document.cookie = s;
}
window.onload = setCookie('test', 'sample', 7);
</script>