PHP读取和写入CSV文件的示例代码

作者:金刀大菜牙 时间:2023-05-24 23:54:02 

1. 什么是 CSV 文件

CSV(逗号分隔值)文件是使用逗号分隔信息的文本文件。该文件的每一行都是一条数据记录,也就意味着它可以用于以表格的形式展现信息。

2. 从 CSV 文件中读取数据

我将使用内置函数 file 从 CSV 文件中读取数据,然后使用 str_getcsv() 解析包含逗号的字符串。

在介绍如何使用str_getcsv() 函数之前,我想向你介绍如何输出 CSV 文件中的数据。

<?php
   if($_FILES){
       var_dump(file($_FILES['file']['tmp_name'], FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
   }
?>

<html>
   <body>
       <form method="post" enctype="multipart/form-data">
           <input type="file" name="file" />
           <button>upload</button>
       </form>
   </body>
</html>

当我使用上面的代码上传文件时,输出以下数据:

PHP读取和写入CSV文件的示例代码

如图所示,每个字符串中都有逗号,每个逗号将一条信息与另一条信息隔开。

使用 array_map() 函数,并且 str_getcsv() 作为回调函数,该回调将解析每个具有逗号的字符串并将它们分隔在一个数组中。

if($_FILES){
   //loop through the csv file into an array
   $theCSV = array_map('str_getcsv', file($_FILES['file']['tmp_name'], FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
   //dump result
   var_dump($theCSV);
}

输出如下:

PHP读取和写入CSV文件的示例代码

输出的数据看起来比之前要好得多,我们将列标题(全名、QQ、电子邮件)作为该数组的第一个元素。

我们使用 array_walk() 函数遍历此数组 ,然后提供一个回调函数,它将列标题(全名、QQ、电子邮件)和每个 CSV 数据组合为一个新数组。

if($_FILES){
   //loop through the csv file into an array
   $theCSV = array_map('str_getcsv', file($_FILES['file']['tmp_name'], FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
   /*Walk through the array and combine the headers which is the first element of our csv array with the rest of the csv data*/
   array_walk($theCSV, function(&$ary) use($theCSV) {
       $ary = array_combine($theCSV[0], $ary);
   });
   //dump result
   var_dump($theCSV);
}
?>

注意,在上面的回调函数中,我使用了变量& 运算符将 $ary 通过引用传递给函数,这使的我们可以修改原始数组。当我们运行上面的代码时,这就是我们的 CSV 数组现在的样子:

PHP读取和写入CSV文件的示例代码

注意这里有个问题:这个新数组的第一个元素是表头,因为我们之前让它与 CSV 数组的其他数组组装在了一起。可以使用 array_shift() 来解决这个问题。

if($_FILES){
   //loop through the csv file into an array
   $theCSV = array_map('str_getcsv', file($_FILES['file']['tmp_name'], FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
   /*Walk through the array and combine the headers which is the first element of our csv array with the rest of the csv data*/
   array_walk($theCSV, function(&$ary) use($theCSV) {
       $ary = array_combine($theCSV[0], $ary);
   });
   //remove column headers which is the first element
   array_shift($theCSV);
   //dump result
   var_dump($theCSV);
}

这就是我们最终的 CSV 数组的样子

PHP读取和写入CSV文件的示例代码

将上面的代码封装成一个函数,如下:

function readCSV($file){
   if(empty($file) || !file_exists($file)) return;
   //store the column headers
   $headers = null;
   $theCSV = array_map('str_getcsv', file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
   /*Walk through the array and combine the headers which is the first element of our csv array with the rest of the csv data*/
   array_walk($theCSV, function(&$ary) use($theCSV, &$headers) {
           $ary = array_combine($theCSV[0], $ary);
           //store the headers
           $headers = $theCSV[0];
   });
   //remove column headers which is the first element of our csv array
   array_shift($theCSV);
   //return data
   return array(
       "headers" => $headers,
       "data" => $theCSV
   );
}

3. 将数据写入 CSV 文件

将数据写入 CSV 文件,其逻辑是使用 fopen() 函数以附加模式打开 CSV 文件, 然后用 fputcsv() 解析我们要写入 CSV 文件的数据,然后此方法将这些数据写入文件流当中。

if($_SERVER['REQUEST_METHOD'] == "POST"){
   $file = "./my_csv_file.csv";
   //loop through the csv file into an array
   $csvData = readCSV($file);
   //create array to store the new data
   $newData = [];
   //loop through headers and then add values as a new array
   foreach($csvData['headers'] as $index => $key){
       if($key == 'Full Name'){
           $newData[$key] = $_POST['full_name'];
       }elseif($key == 'Email'){
           $newData[$key] = $_POST['email'];
       }elseif($key == 'Phone'){
           $newData[$key] = $_POST['phone'];
       }else{
           $newData[$key] = '';
       }
   }
   var_dump($newData);
}

如图所示就是我们将写入到 CSV 文件的数组的数据

PHP读取和写入CSV文件的示例代码

在我们将这些数据写入到 CSV 文件之前,我们必须去掉 key,我们可以使用 array_values() 函数

if($_SERVER['REQUEST_METHOD'] == "POST"){
   $file = "./my_csv_file.csv";
   //loop through the csv file into an array
   $csvData = readCSV($file);
   //create array to store the new data
   $newData = [];
   //loop through headers and then add values as a new array
   foreach($csvData['headers'] as $index => $key){
       if($key == 'Full Name'){
           $newData[$key] = $_POST['full_name'];
       }elseif($key == 'Email'){
           $newData[$key] = $_POST['email'];
       }elseif($key == 'Phone'){
           $newData[$key] = $_POST['phone'];
       }else{
           $newData[$key] = '';
       }
   }
   //open the csv file as in append mode
   $fp = fopen($file, 'a+');
   //remove keys from new data
   $newData = array_values($newData);
   //append data to csv file
   fputcsv($f, $newData);
   //close the resource
   fclose($fp);
}

不出意外的话,数据就会成功写入到 CSV 文件当中去了。

PHP读取和写入CSV文件的示例代码

来源:https://juejin.cn/post/7221408294237208637

标签:PHP,CSV
0
投稿

猜你喜欢

  • Python 分析Nginx访问日志并保存到MySQL数据库实例

    2024-01-22 08:43:23
  • windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)

    2022-03-22 02:31:42
  • ORACLE常见错误代码的分析与解决三

    2024-01-16 13:03:41
  • PyQt5实现五子棋游戏(人机对弈)

    2022-05-22 12:00:50
  • Python编程之列表操作实例详解【创建、使用、更新、删除】

    2021-12-24 19:03:03
  • Python3中常用的处理时间和实现定时任务的方法的介绍

    2022-05-13 09:25:25
  • Python中的tkinter库简单案例详解

    2021-01-20 14:25:16
  • Python结合百度语音识别实现实时翻译软件的实现

    2022-03-26 23:22:33
  • 常用python数据类型转换函数总结

    2023-07-27 23:07:16
  • Asp定时执行操作 Asp定时读取数据库(网页定时操作详解)

    2011-03-17 11:04:00
  • 关于javascript原型的修改与重写(覆盖)差别详解

    2023-07-02 05:07:26
  • 使用PHP生成二维码的两种方法(带logo图像)

    2023-11-14 11:00:30
  • Python生成可执行文件之PyInstaller库的使用方式

    2021-11-29 00:41:49
  • python实现windows壁纸定期更换功能

    2022-09-06 15:05:11
  • python中defaultdict方法的使用详解

    2022-06-25 05:07:09
  • Python使用Pandas库常见操作详解

    2022-12-10 09:03:13
  • 从零开始学YII2框架(五)快速生成代码工具 Gii 的使用

    2024-05-11 09:54:56
  • Oracle + mybatis实现对数据的简单增删改查实例代码

    2024-01-27 06:14:53
  • python向已存在的excel中新增表,不覆盖原数据的实例

    2022-04-26 15:16:51
  • Git配置用户签名方式的拓展示例实现全面讲解

    2023-03-12 14:46:59
  • asp之家 网络编程 m.aspxhome.com