【楽々理解】PHPでCSVを読み込む7ステップ

初心者が楽々理解できるPHPでCSVを読む7ステップの解説PHP
この記事は約13分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

こんにちは、プログラミング初心者の皆さん。

これからPHPでCSVファイルを読む方法を学びたいですか?

それなら、あなたが求めている全ての情報がこの記事に詰まっています。

この記事を読めば、PHPでCSVファイルを読む7つのステップを理解し、実際にCSVファイルを読み込むことができるようになります。

また、詳しい使い方、対処法、注意点、カスタマイズ方法についても分かるようになります。

●PHPとCSVの関係について

まず初めに、PHPとCSVの関係について少し説明しましょう。

PHPはウェブサーバー側で実行されるスクリプト言語で、データベースと連携したり、ファイルを操作したりといったことが可能です。

その中には、もちろんCSVファイルの読み取りも含まれています。

CSVとはComma Separated Valuesの略で、その名の通り、カンマで値が区切られているファイル形式を指します。

CSVファイルはデータの入出力や、プログラム間でのデータのやり取りによく使われています。

そのため、PHPでCSVファイルを扱えるようになると、データ分析やデータの管理など、様々な作業が効率化されます。

●PHPでCSVを読む7つのステップ

それでは具体的なステップについて見ていきましょう。

○ステップ1:ファイルをオープンする

PHPでファイルを扱うにはまず、そのファイルを開く必要があります。

これはfopen関数を使用します。

fopen関数は、第一引数にファイルのパス、第二引数にモードを指定します。

CSVファイルを読み取るためには、モードに’r’を指定します。

○ステップ2:ファイルから1行読み取る

ファイルを開けたら、次にその中身を読み取ります。

これにはfgetcsv関数を使います。

この関数は引数にファイルポインタをとり、CSV形式の行を配列として返します。

○ステップ3:読み取った行を配列に変換する

fgetcsv関数によって読み取った行はすでに配列になっていますが、更にその配列を加工したい場合は、自由に処理を追加できます。

例えば、配列の要素をトリムしたり、特定の値を変換したりできます。

○ステップ4:すべての行を読み取るまでステップ2と3を繰り返す

CSVファイルの全ての行を読み取るには、ステップ2と3を繰り返すことになります。

これは通常、whileループを使って実現します。

fgetcsv関数はファイルの終わりに達するとfalseを返すので、これをループの終了条件とします。

○ステップ5:ファイルをクローズする

最後に、開いたファイルは必ず閉じる必要があります。

これはfclose関数で行います。

●サンプルコード

それでは、前述のステップを踏む具体的なコードについて見ていきましょう。

○サンプルコード1:基本的なCSVファイルの読み取り

まずは、基本的なCSVファイルの読み取りを行うコードを紹介します。

この例では、PHPの組み込み関数を使って、CSVファイルを開いて、その内容を1行ずつ読み取り、その行を配列に変換して表示しています。

<?php
// CSVファイルをオープンする
$handle = fopen('example.csv', 'r');

// ファイルが正しく開けなかった場合はエラーメッセージを表示
if ($handle === false) {
    die('ファイルが開けませんでした。');
}

// ファイルの内容を1行ずつ読み取る
while (($data = fgetcsv($handle)) !== false) {
    // 読み取った行を表示
    print_r($data);
}

// ファイルをクローズする
fclose($handle);
?>

このコードでは、まず’example.csv’という名前のCSVファイルを読み取りモードで開いています。

そして、whileループを使ってファイルの内容を1行ずつ読み取り、その行を配列として取得しています。

そして、その配列をprint_r関数で表示しています。最後に、開いたファイルを閉じています。

このコードを実行すると、CSVファイルの内容が1行ずつ配列として表示されます。

配列の各要素はCSVの各カラム(列)に対応しており、CSVファイルの内容をプログラム内で利用することができます。

○サンプルコード2:エラーハンドリングを含むCSVファイルの読み取り

次に、エラーハンドリングを含むCSVファイルの読み取りを行うコードを紹介します。

この例では、ファイルが正しく開けなかった場合にエラーメッセージを表示するようにしています。

<?php
// CSVファイルをオープンする
$handle = @fopen('example.csv', 'r');

// ファイルが正しく開けなかった場合はエラーメッセージを表示
if ($handle === false) {
    die('ファイルが開けませんでした。');
}

// ファイルの内容を1行ずつ読み取る
while (($data = fgetcsv($handle)) !== false) {
    // 読み取った行を表示
    print_r($data);
}

// ファイルをクローズする
fclose($

handle);
?>

このコードでは、最初にCSVファイルを読み取りモードで開く試みを行っています。

しかし、このときに@記号を関数の前につけることで、もし何らかのエラーが発生した場合でもプログラムが停止することなく処理が進むようにしています。

そして、もしファイルが正しく開けなかった場合には、その旨のエラーメッセージを表示しています。

このように、エラーハンドリングを行うことで、予期しない問題が発生したときでも適切に対応することができます。

○応用例1:CSVデータをデータベースに保存する

それでは、具体的な応用例として、CSVデータをデータベースに保存する方法を見てみましょう。

この例では、MySQLのデータベースを操作するためのPHPのPDOオブジェクトを使用しています。

<?php
// PDOオブジェクトを作成
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');

// CSVファイルをオープン
$handle = fopen('example.csv', 'r');
if ($handle === false) {
    die('ファイルが開けませんでした。');
}

// CSVファイルの内容を1行ずつ読み取る
while (($data = fgetcsv($handle)) !== false) {
    // SQLクエリを準備
    $sql = 'INSERT INTO example_table (column1, column2, column3) VALUES (?, ?, ?)';
    $stmt = $db->prepare($sql);

    // パラメータをバインドしてクエリを実行
    $stmt->execute($data);
}

// ファイルをクローズ
fclose($handle);
?>

このコードでは、まずCSVファイルをオープンし、その内容を1行ずつ読み取ります。

そして、各行のデータをSQLクエリのパラメータにバインドし、データベースにインサートします。

このコードを実行すると、CSVファイルの全ての行がデータベースのテーブルに保存されます。

○応用例2:CSVデータをHTMLテーブルとして表示する

次に、CSVデータをHTMLテーブルとして表示する方法を見てみましょう。

<?php
echo '<table>';

// CSVファイルをオープン
$handle = fopen('example.csv', 'r');
if ($handle === false) {
    die('ファイルが開けませんでした。');
}

// CSVファイルの内容を1行ずつ読み取り
while (($data = fgetcsv($handle)) !== false) {
    echo '<tr>';
    foreach ($data as $cell) {
        echo '<td>' . htmlspecialchars($cell) . '</td>';
    }
    echo '</tr>';
}

echo '</table>';

// ファイルをクローズ
fclose($handle);
?>

このコードでは、CSVファイルをオープンし、その内容を1行ずつ読み取ります。

そして、各行をHTMLテーブルの行として、各セルをテーブルのセルとして表示します。

このコードを実行すると、CSVファイルの全ての行がHTMLテーブルとして表示されます。

ここでの重要な点は、出力するセルのデータをhtmlspecialchars関数を使ってエスケープすることです。

これは、HTMLに挿入する前にテキストをエスケープすることで、クロスサイトスクリプティング(XSS)というセキュリティリスクを防ぐための一般的なベストプラクティスです。

以上のように、PHPを使ってCSVファイルを読み取ることで、その内容をデータベースに保存したり、HTMLテーブルとして表示したりと、様々な形で活用することが可能です。

●CSV読み取り時の注意点と詳細な対処法

CSVデータの読み取りは一見簡単に見えますが、さまざまな注意点と問題が存在します。

それらを理解し、適切に対処することで、安全かつ効率的なプログラムを書くことができます。

1.エンコーディングの問題

CSVファイルは多くの場合、特定のエンコーディング(UTF-8やShift-JISなど)で作成されます。

そのエンコーディングがPHPスクリプトのエンコーディングと一致しない場合、文字化けやエラーを引き起こす可能性があります。

この問題に対処する一つの方法は、mb_convert_encoding関数を使用してCSVデータのエンコーディングを適切に変換することです。

2.改行コードの問題

CSVファイルの改行コードは、作成された環境によって異なる可能性があります(WindowsではCR+LF、MacやLinuxではLF)。

PHPのfgetcsv関数は自動的にこれらの改行コードを処理しますが、それでも問題が生じることがあります。

そのような場合には、str_replace関数などを使用して改行コードを適切に処理することが必要です。

3.データ形式の問題

CSVデータは基本的にはテキスト形式ですが、その中の各列が特定のデータ形式(例えば、日付や数値)を持つことがあります。

そのデータ形式がPHPスクリプトで期待される形式と一致しない場合、エラーや予期しない結果を引き起こす可能性があります。

この問題に対処する一つの方法は、各列のデータ形式を適切に検証し、必要に応じて変換することです。

以上のように、CSVデータの読み取りにはさまざまな注意点がありますが、これらを適切に理解し対処することで、安全かつ効率的にCSVデータを扱うことが可能になります。

次に、これらの対処法を具体的なコード例とともに見てみましょう。

ここでは、エンコーディングの問題を解決するためのコード例を紹介します。

<?php
$handle = fopen('example.csv', 'r');
if ($handle === false) {
    die('ファイルが開けませんでした。');
}

while (($data = fgetcsv($handle)) !==

 false) {
    $data = array_map(function($value) {
        return mb_convert_encoding($value, 'UTF-8', 'SJIS-win');
    }, $data);
    // ここで$dataを使って何か処理を行う
}

fclose($handle);
?>

このコードでは、fgetcsvで読み取ったCSVデータの各要素(列)をmb_convert_encoding関数を使ってUTF-8に変換しています。

これにより、Shift-JISでエンコードされたCSVデータも適切に扱うことができます。

なお、ここではエンコーディング変換を行う前に、ファイルが正しく開けているかどうかを確認するために、fopenの戻り値がfalseではないか確認しています。

このコードを実行すると、CSVファイルの内容が適切にUTF-8に変換され、その後の処理に用いることができます。

●カスタマイズの方法

PHPでCSVデータを読み込む際に、更に柔軟性を持たせるためには、いくつかのカスタマイズ方法があります。

1.区切り文字のカスタマイズ

デフォルトでは、CSVファイルはコンマ(,)でデータが区切られていると想定されています。

しかし、実際にはタブ(\t)やセミコロン(;)など他の文字で区切られている場合もあります。

このような場合には、fgetcsv関数の第2引数で区切り文字を指定することができます。

2.データの前処理・後処理

CSVデータを読み込んだ後、それをそのまま利用するのではなく、何らかの形で処理を行いたい場合があります。

そのような場合には、array_map関数などを利用して、読み込んだデータに対して一括処理を行うことができます。

具体的なコード例を見てみましょう。

ここでは、区切り文字のカスタマイズとデータの前処理の例を示します。

<?php
$handle = fopen('example.csv', 'r');
if ($handle === false) {
    die('ファイルが開けませんでした。');
}

while (($data = fgetcsv($handle, 0, "\t")) !== false) {
    $data = array_map(function($value) {
        // 文字列の前後の空白を削除
        return trim($value);
    }, $data);
    // ここで$dataを使って何か処理を行う
}

fclose($handle);
?>

このコードでは、fgetcsvの第3引数で区切り文字をタブに指定しています。

また、array_map関数を使って読み込んだ各データから前後の空白を削除しています。

これにより、CSVファイルがタブで区切られている場合や、データに余分な空白が含まれている場合でも適切に処理を行うことができます。

このコードを実行すると、タブで区切られたCSVファイルの内容が適切に読み取られ、その後の処理に用いることができます。

また、各データの前後の空白も削除されているため、それによるエラーや混乱を避けることができます。

まとめ

本記事では、PHPを使ってCSVファイルを読み込む手法とその詳細な使い方について説明しました。

また、CSVの読み取り時の注意点や、カスタマイズの方法についても詳しく解説しました。

初心者の方でも理解できるように、基本的なファイルの開閉から、データの読み取り、そしてエラーハンドリングに至るまで、具体的なコード例と共に説明を行ってきました。

この記事を参照すれば、初心者でもPHPを使ってCSVファイルを読み取る基本操作が理解できることでしょう。

また、カスタマイズの方法として、区切り文字の変更やデータの前処理・後処理の方法を紹介しました。

これらの手法を用いることで、より多様なCSVファイルに対応したり、読み取ったデータを効率的に利用することが可能となります。

プログラミングはその基本操作を理解し、その上で柔軟にカスタマイズを行うことで初めて、自分自身の目的に合わせたプログラムを作成することが可能となります。

この記事が、PHPでCSVファイルを扱う際の一助となれば幸いです。