忍者ブログ
バナヤンの忍者風呂
忍者ブログのカスタマイズ、各種WEBツールのテストなど試行錯誤の日々。 VMLによる地図の作成を研究していましたが、一時中断して、今はPHPを勉強しているところです。
ニュース
この欄には、このブログの内容に関連するニュースを掲載する予定です。
お知らせ
この欄には管理人からのお知らせなどを掲載します。
[62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72]

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

PHP CSVファイルの読込み(fgetcsv)

CSVファイルのCSVは、"Comma Separated Values"の略。「コンマ区切りテキストファイル」のこと。データをカンマ「,」で区切って並べます。表計算やデータベースなど多くのアプリケーションでこの形式のファイルの入出力をサポートしています。ExcelやAccessでも利用できます。実体はテキストファイルなので、「メモ帳」などのテキストエディタでも作成、編集が可能です。

あるアプリケーションにあるデータを別のアプリケーションで使用する場合に、いったんCSVファイルに出力して、それからそのCSVファイルを読み込む形でデータを入力することがあります。既存のデータを一括入力できるので、非常に便利です。

今回は、PHPでCSVファイルを読み込む時に使用される「fgetcsv」関数について考えてみましょう。

「fgetcsv」関数を使用する前には、CSVファイルをオープンしておく必要があります。ファイルをオープンするとハンドル値が返りますので、通常、これをファイルポインタ用の変数に代入します。

$fp=fopen("file.csv","r");


ファイルのオープン時には、ファイルポインタは「0」の位置にあります。ここで「fgetcsv」関数を実行すると、1行目のレコードを取得して、配列を返します。そして、ファイルポインタは「1」の位置に移ります。


$data=fgetcsv($fp,1000);

fgetcsvの2番目のパラメータは、1行の長さです。もしも指定値より長い行があると、超過する部分は無視されます。
3番目のパラメータとして、フィールド区切り文字を指定できます。特に指定がばければ カンマ「,」です。
4番目のパラメータとして、フィールド囲い文字を指定できます。特に指定がなければ ダブルクオーテーション「"」です。

「fgetcsv」関数は、ファイルの終端に達したとき、「FALSE」を返します。

すべてのレコードを処理するには、ループ処理で次々にレコードを取得していきます。通常、「WHILE」を用います。

$fp = fopen ($_POST['filename'],"r");
echo "<table>";
while($data = fgetcsv ($fp, 1000, ",")){
echo "<tr>";
$fields = count($data);
for($i=0;$i<$fields;$i++){
echo "<td style='border:#003 solid 1px;'>".$data[$i]."</td>";
}
echo "</tr>";
}
echo "</table>";
fclose ($fp);


下のサンプルは、ファイル名を入力してCSVファイルのデータをブラウザにテーブルで表示するものです。

まず、そのファイル名のファイルが存在するか確認し、ファイルの第1行目だけ出力します。次に全レコードを出力します。

[ソース]CSVファイル「pref.csv」---都道府県コード

1,北海道
2,青森
3,岩手
4,宮城
5,秋田
6,山形
7,福島
8,茨城
9,栃木
10,群馬
11,埼玉
12,千葉
13,東京
14,神奈川
15,新潟
16,富山
17,石川
18,福井
19,山梨
20,長野
21,岐阜
22,静岡
23,愛知
24,三重
25,滋賀
26,京都
27,大阪
28,兵庫
29,奈良
30,和歌山
31,鳥取
32,島根
33,岡山
34,広島
35,山口
36,徳島
37,香川
38,愛媛
39,高知
40,福岡
41,佐賀
42,長崎
43,熊本
44,大分
45,宮崎
46,鹿児島
47,沖縄


[イメージ]入力画面
fgetcsv入力画面サンプル

[イメージ]チェック画面
fgetcsvファイルなしサンプル

[イメージ]1行表示画面
fgetcsv1行表示サンプル


[イメージ]全行表示画面
fgetcsv全行表示サンプル

[ソース]fgetcsv サンプルPHP

<?php
if($_POST['filename']){
$mode="checked";
$title="チェックモード";
if(file_exists($_POST['filename'])){
$msg="このファイルの先頭行は次のとおりです。すべてのデータを出力しますか?";
}else{
$mode="error";
$title="確認して下さい。";
$msg="この名前のファイルは見つかりませんでした。";
}
}else{
$mode="input";
$title ="入力モード";
$msg="ファイル名を入力して下さい。";
}
if($_POST['regist']){
$mode="echo";
$title ="出力モード";
$msg="出力しました。";
}
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Pragma" content="no-cache">
<title>PHP fgetcsv</title>
</head>

<body>
<h1><?= $title ?></h1>
<p><?= $msg ?></p>
<form method='post' action="<?= $_SERVER[PHP_SELF] ?>">
<input type='text' name="filename" value="<?= $_POST['filename'] ?>">
<?php
if($mode=="input"||$mode=="checked"||$mode=="error"){
echo "<input type='submit' name='check' value='check'>";
}
if($mode=="checked"){
echo "<input type='submit' name='regist' value='出力'>";
}
?>
</form>

<?php
if($mode=="checked"){
$fp = fopen ($_POST['filename'],"r");
$data = fgetcsv ($fp, 1000, ",");
$fields = count($data);
echo "<table><tr>";
for($i=0;$i<$fields;$i++){
echo "<td style='border:#003 solid 1px;'>".$data[$i]."</td>";
}
echo "</tr></table>";
fclose ($fp);
}
?>

<?php
if($mode=="echo"){
$fp = fopen ($_POST['filename'],"r");
echo "<table>";
while($data = fgetcsv ($fp, 1000, ",")){
echo "<tr>";
$fields = count($data);
for($i=0;$i<$fields;$i++){
echo "<td style='border:#003 solid 1px;'>".$data[$i]."</td>";
}
echo "</tr>";
}
echo "</table>";
fclose ($fp);
}
?>
</body>
</html>


次は、「CSVファイルをSQLiteテーブルに入力する」について考えたいと思います。
PR
QRコード
忍者ブログ [PR]
Copyright (C) 2006 banayan ALL RIGHTS RESERVED.