Top > diary > 2007-07-07

table_edit2.inc.php Excel出力のCSVについて考える Edit

 先週、なんとかCSV入出力に対応したものの単純なCSV形式(改行や「,」を含んだフィールドは想定しない)で止めていました。そして今週、色々考えてみてある程度まとまってきたので、コードを書いてみることにしました。

  • Excelの出力するCSVを観察してみたところ次の仕様が存在します。
    • セル内に「"」「,」「CRLF(改行)」があったとき「"セル"」のようにセルを""で括ります。
    • 「"」がセル内にあった場合、「"」が追加され「""」となります。(例 「あ"いう」→「あ""いう」)
       他にもあるかもしれませんが、とりあえず上の条件を満たす感じにします。
       一応、参考になるコードがないかと調べてみましたが、正規表現で取り込んでる例が多い!。だが私は正規表現が苦手なので、今回はなるべく使わない事にしました。
  1. 取り込んだCSV行の中に「"」がいくつあるか数え、偶数、奇数を判断します。
    1. 偶数の時 「,」分割処理。
    2. 奇数の時 行を次の行と結合して前の処理に戻る。
  2. 分割したフィールドの中に「"」が幾つあるか数え、奇数、偶数を判断します。
    1. 偶数の時 両端の「"」を取り除き、「""」が存在すれば「"」に置き換える。
    2. 奇数の時 フィールドに「,」を追加する。次のフィールドと結合して前の処理に戻る。
class csv
{
	var $join_line = '';
	var $list_csv = array();

	function csv_import_cv($line)
	{
		$this->join_line .= $line;
		$chk_count = substr_count ( $this->join_line, '"');
		if (!( $chk_count % 2 )) {
			$csv_fields = array();
			$join_f = '';
			$fields = explode(',', $this->join_line);
			foreach ( $fields as $field ) {
				$chk_count_f = substr_count ( $join_f, '"');
				if (!( $chk_count_f % 2 )) {
					$csv_f = preg_match('/^"(.*?)"$/', $join_f, $match) ? $match[1] : $join_f;
					$csv_fields[] = str_replace( '""', '"', $csv_f);
					$join_f = '';
				} else {
					$join_f .= ',';
				}
			}
			$this->join_line = '';
			$this->list_csv[] = $csv_fields;
		}
	}
}

こんな感じだろうか…


Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes