ウェブ、ショウジン

CSVファイルのデータを表示する

2010-6-13
Category
PHP

前にやったやつ(それはもっと色々組み合わさって入り組んでいた)の復習で、それをひとつひとつ単純なものに分けてあらためてまとめておこうと思ったら、その単純なやつがいきなり出来なくて数十分苦労したので、そのへんも含めてあらためてメモしておくことにした。
やりたいことはホントに単純にCSVデータの内容をphpのループ処理を使って表示すること。ひとつひとつのレコードを改行で区切り、各レコードにおける各要素をカンマで区切って。CSVデータの内容は以下のとおり。

test.csv

かいきいわい,ka,快気祝い,病気の全快を祝うこと。
がいろじゅ,ka,街路樹,道路に沿って植え連ねた樹木。
あいことば,a,合い言葉,味方同士であらかじめ決めてある合図の言葉。

ちょろっと検索するとfgetcsv()関数を使ったやり方が一般的らしくてけっこう出てくるんだけど(実際にそれが一般的なのかは知らない)要素にマルチバイト文字(日本語)が入っていると、これが出力されない(空白)ことが判明。ダブルクォートでそのマルチバイト文字列だけ囲めば大丈夫なことが分かったけど、これは実際の運用においては実用的ではない。(と、オレは思う)

fputcsv()関数というのもあって、これは必要に応じて文字列をダブルクォートで囲ってくれたりして、なかなか便利そうではあるのだけれども、これも文字コードの指定ができないとか、欠点があるらしい。

なので、fopen()関数でCSVデータを開いてとか、最後にfclose()関数で閉じてとか、そういうのを一切しないで、CSVデータ(test.csv)を定数として定義した上で配列としてその内容を格納、それをfor文やforeach文で出力するだけにしてみた。これならマルチバイト文字だけダブルクォートで囲む必要もないので。

まずfor文を使った場合。

<?php
// 用意したCSVデータを定数csvdataとして定義
define(csvdata, "test.csv");

// csvdataの内容をfile()関数を使って配列として$dataに格納
$data = file(csvdata);

for($i = 0; $i < count($data); $i++){
    echo $data[$i]."<br />";
}

つづいてforeach文を使った場合。

<?php
// 用意したCSVデータを定数csvdataとして定義
define(csvdata, "test.csv");

// csvdataの内容をfile()関数を使って配列として$dataに格納
$data = file(csvdata);

// foreachで配列$dataの各要素をループ処理して出力
foreach($data as $value){
    echo $value."<br />";
}

どちらも出力結果は同じ。でも、若干foreach文のほうがシンプルでスッキリしているし、なんかfor文よりも処理速度も速いらしいので(といってもこのサンプルレベルでは関係ないだろうけど)使えるときはこっちのforeach文を積極的に使うことにした。

Categories

Tag Cloud

AdMob Android Apache centos CodeIgniter EC-CUBE facebookアプリ facebookページ feed Firefox Flash google googleanalytics htaccess iPad iPhone JavaScript lamp mobile nginx ogp pear php plugin rollover rss sendmail setting smarty ssh Titanium Mobile Titanium Studio tutorial ubuntu vim VirtualBox vmware vps Windows WordPress xampp youtube さくらインターネット アクセス解析 カスタム投稿