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