یکی از قالب های رایج برای ذخیره کردن و انتقال رکوردهای داده ای، قالب CSV است. دراین آموزش، با زبان PHP برنامه ای می نویسیم که بتواند هر فایل با پسوند csv را آپلود کرده، محتوای آنرا باز کرده و رکوردهای آنرا در یک جدول نمایش دهد.

معرفی قالب CSV

فرمت csv که از عبارت  Comma-separated values گرفته شده است یکی از قالب های استاندارد و رایج برای نگهداری رکوردها در فایل های متنی و انتقال اطلاعات است که توسط بسیاری از نرم افزارها برای صدور داده ها (export) استفاده می شود و اکثر نرم افزارها قادر به خواندن فرمت csv و بازکردن رکوردهای آن هستند. شما هم می توانید در برنامه های کاربردی php خود، گزینه ای برای  ورود داده ها از فایل های با پسوند csv داشته باشید.

در هر سطر از فایل  CSV یک رکورد قرار می گیرد و بین فیلدهای آن از جداکننده خاصی مثل کاما (,) یا tab و … استفاده می شود. در بعضی از فایل های csv هم هر فیلد دارای طول مشخص است . اینکه بین فیلدها از چه کاراکتری استفاده شده باشد در برنامه کلی تاثیری نداشته و فقط کافی است کاراکتر جداکننده را به درستی در برنامه تعیین کنیم.

طراحی فرم ارسال فایل

برای دریافت فایل csv کاربر باید فرمی را دیده و بتواند فایل را انتخاب کرده و به برنامه پی اچ پی ارسال کند . این فرم دارای حداقل یک ورودی فایل و یک رکمه ارسال خواهد بود و توجه داشته باشید که فرم باید از متد post برای ارسال داده ها استفاده کرده و خاصیت enctype آن هم مساوی multipart/form-data قرار گرفته باشسد تا بتواند فایل ها را ارسال کند. در زیر کدهای طرحی فرم را می بینید:

<form action="" method="post" enctype="multipart/form-data">
    Select file:
    <input type="file" name="csv">
    <input type="submit" value="import">
</form>

استخراج رکوردها از فایل csv

بعد از آپلود فایل باید دستوراتی نوشته شود تا رکوردها را از فایل csv بخواند که می تواند ابتدا کل محتوای فایل خوانده ، و سپس آنرا بر اساس کاراکتر خط جدید \n به سطرها بشکند و سپس هر سطر را بر اساس جداکننده بین فیلدها که معمولا کاما هست به فیلدها بشکند.

در قطعه کد زیر برای نگهداری اطلاعات از یک آرایه دو بعدی استفاده شده که هر سطر آن برای نگهداری یک رکورد و هر ستون آن برای نگهداری یک فیلد در نظر گرفته شده است.

<?php
if(isset($_FILES['csv']))
{
    $file = file_get_contents($_FILES['csv']['tmp_name']);
    $lines = explode("\n" , $file );
    unset($file);
    for ($i=0 ; $i<count($lines) ;$i++)
        $lines[$i] = explode(',',$lines[$i]);
}
?>

نمایش رکوردها در جدول

نهایتاً برای نمایش رکوردهای خوانده شده از فایل CSV که حالا در داخل یک آرایه قرار گرفته اند می توانیم از حلقه های تکرار مناسب و تگ های جدول استفاده کنیم. در قطعه کد زیر اولین سطر فایل بعنوان سطر هدر جدول استفاده شده و سطرهای بعدی بعنوان داده ها در سطرهای بعدی جدول چاپ شده اند.

<?php if(isset($lines)) : ?>
    <table>
        <tr>
            <?php foreach ($lines[0] as $head): ?>
              <th> <?=$head ?> </th>
            <?php endforeach;?>
        </tr>
        <?php for ($i=1 ; $i<count($lines);$i++): ?>
            <tr>
                <?php foreach ($lines[$i] as $data): ?>
                    <td> <?=$data ?> </td>
                <?php endforeach;?>
            </tr>

        <?php endfor ; ?>
    </table>
 <?php endif; ?>

برنامه کامل ورود فایل CSV

نمایی از اجرای برنامه خواندن فایل csv مشخصات دانشجویان و نمایش رکوردها را در زیر می بینید:

ورود فایل CSV در PHP - کدنویسان

در ادامه برنامه کامل برای آپلود فایل CSV و تشخیص رکوردها و نمایش آنها آمده است، همچنین می توانید با کمک لینک پایین صفحه، نمونه برنامه قابل اجرا به همراه نمونه فایل CSV را دریافت کرده و ازمایش کنید.

<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
<?php
if(isset($_FILES['csv']))
{
    $file = file_get_contents($_FILES['csv']['tmp_name']);
    $lines = explode("\n" , $file );
    unset($file);
    for ($i=0 ; $i<count($lines) ;$i++)
        $lines[$i] = explode(',',$lines[$i]);
}
?>

  <form action="" method="post" enctype="multipart/form-data">
      Select file:
      <input type="file" name="csv">
      <input type="submit" value="import">
  </form>
  <?php if(isset($lines)) : ?>
      <table>
          <tr>
              <?php foreach ($lines[0] as $head): ?>
                <th> <?=$head ?> </th>
              <?php endforeach;?>
          </tr>
          <?php for ($i=1 ; $i<count($lines);$i++): ?>
              <tr>
                  <?php foreach ($lines[$i] as $data): ?>
                      <td> <?=$data ?> </td>
                  <?php endforeach;?>
              </tr>
          <?php endfor ; ?>
      </table>
   <?php endif; ?>
</body>
</html>
نمایش قابل چاپ