Top > diary > 2007-07-07

***table_edit2.inc.php Excel出力のCSVについて考える [#x0d65a3b]
 先週、なんとかCSV入出力に対応したものの単純なCSV形式(改行や「,」を含んだフィールドは想定しない)で止めていました。そして今週、色々考えてみてある程度まとまってきたので、コードを書いてみることにしました。~
//cut
-Excelの出力するCSVを観察してみたところ次の仕様が存在します。
--セル内に「"」「,」「CRLF(改行)」があったとき「"セル"」のようにセルを""で括ります。
--「"」がセル内にあった場合、「"」が追加され「""」となります。(例 「あ"いう」→「あ""いう」)~
 他にもあるかもしれませんが、とりあえず上の条件を満たす感じにします。~
 一応、参考になるコードを作っていないかと調べてみましたが、正規表現で取り込んでる例が多い!。だが私は正規表現が苦手なので、今回はなるべく使わない事にしました。~
 一応、参考になるコードがないかと調べてみましたが、正規表現で取り込んでる例が多い!。だが私は正規表現が苦手なので、今回はなるべく使わない事にしました。~
+取り込んだCSV行の中に「"」がいくつあるか数え、偶数、奇数を判断します。
++偶数の時 「,」分割処理。
++奇数の時 行を次の行と結合して前の処理に戻る。
+分割したフィールドの中に「"」が幾つあるか数え、奇数、偶数を判断します。
++偶数の時 両端の「"」を取り除き、「""」が存在すれば「"」に置き換える。
++奇数の時 フィールドに「,」を追加する。次のフィールドと結合して前の処理に戻る。

#geshi{{{
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;
		}
	}
}
}}}
こんな感じだろうか…

リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS