<?php
/**
 * CsvFormat
 * データをCSVとして出力する時のクラスです。
 * $Id: CsvFormat.inc,v 1.1 2015/10/08 11:18:56 wanggb Exp $
 * @author iimuro
 * @access public
 * @package jp.aimslib2.io
 */

/* 
 * CSV出力の基本処理
 * ,を含む値→""で囲む
 * "を含む値→""に変換
 */
class CsvFormat{
	
	
	/**
	 * @var array 出力するデータがはいった、２次元配列。
	 */
	public $data = null;
	public $file_path = null;
	public $file_name = null;
	public $delimiter = ",";
	
	/**
	 * @public boolean SJISへの文字コード変換を行うか？trueの場合、行う。
	 */
	public $convert_encoding = true;
	
	/**
	 * @var String 出力時の文字コード。デフォルトで、Shift_JIS。
	 */
	public $output_encoding = "Shift_JIS";
	
	/**
	 * @var String 入力されたデータの文字コード。autoの場合、自動判別を行う。
	 */
	public $data_encoding = "auto";
	
	/**
	 * データをCSV形式で出力したり、保存したりしたいときに利用するクラスです。<br />
	 * ２次元配列でデータをセットします。<br />
	 */
	public function __construct($data = null) {
		if ($data != null) {
			if (is_array($data)) {
				$this->data = $data;
			}
		}
	}
	
	
	/**
	 * 出力時のファイル名をセットします。
	 */
	public function setFileName($name) {
		$this->file_name = $name;
	}
	
	
	/**
	 * ファイルとして保存する場合のディレクトリをセットします。
	 */
	public function setFilePath($path) {
		$this->file_path = $path;
	}
	
	
	/**
	 * 出力時に文字コード変換を行うかを設定します。
	 * @param boolean $convert 文字コード変換を行うか？true:する。
	 * @param String $output_encoding 出力するときの文字コード。
	 * @param String $data_encoding 入力されたデータの文字コード。autoを指定した場合、自動判別。
	 */
	public function setEncodingConvert($convert, $output_encoding = null, $data_encoding = null) {
		
		$this->convert_encoding = $convert;
		
		if ($output_encoding != null) {
			$this->output_encoding = $output_encoding;
		}
		if ($data_encoding != null) {
			$this->data_encoding = $data_encoding;
		}
		
		
	}
	
	/**
	 * 文字列データとして返します。
	 */
	public function toString() {
		$result = "";
		foreach ($this->data as $row) {
			$row_data = "";
			foreach ($row as $cell) {
				if ($row_data != "") {
					$row_data .= $this->delimiter;
				}
				$row_data .= CsvFormat::doCsvEscape($cell);
			}
			$result .= trim($row_data) . "\n";
		}
		
		
		// 文字コード指定がある場合は変換してやる。
		if ($this->convert_encoding) {
			
			if ($this->data_encoding == "auto") {
				$result = mb_convert_encoding($result, $this->output_encoding);
			} else {
				$result = mb_convert_encoding($result, $this->output_encoding, $this->data_encoding);
			}
		}
		
		return $result;
		
	}
	
	
	/**
	 * HTML出力します。
	 */
	public function printOut() {
		if ($this->file_name != null) {
			header("Pragma: cache");
			header("Content-type: application/octet-stream; name=" . $this->file_name);
			header("Content-disposition: attachment; filename=" . $this->file_name);
		} else {
			header("Content-type: application/octet-stream;");
		}
		header("Content-Transfer-Encoding: binary");
		
		print $this->toString();
	}
	
	
	/**
	 * データをCSV出力用にエスケープします。
	 * ,を含む値→""で囲む
	 * "を含む値→""に変換
	 */
	public function doCsvEscape($str) {
		if (strpos($str, "\"") !== false) {
			$str = str_replace("\"", "\"\"", $str); 
		}
		$do_escape = false;
		if (strpos($str, ",") !== false) {
			$do_escape = true;
		}
		if (strpos($str, "\n") !== false) {
			$do_escape = true;
		}
		
		if ($do_escape) {
			$str = "\"" . $str . "\""; 
		}
		
		return $str;
	}
}

?>