当前位置:首页 > PHP教程 > php应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2023-07-11 17:47:03 浏览: 评论:0 

CSV(逗号分隔值)文件是使用逗号分隔信息的文本文件,该文件的每一行都是一条数据记录,也就意味着它可以用于以表格的形式展现信息,本文主要介绍了PHP读取和写入CSV文件的方法,需要的可以参考一下。

1. 什么是 CSV 文件

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

2. 从 CSV 文件中读取数据

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

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

  1. <?php 
  2.     if($_FILES){ 
  3.         var_dump(file($_FILES['file']['tmp_name'], FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)); 
  4.     } 
  5. ?> 
  6. ​ 
  7. <html> 
  8.     <body> 
  9.         <form method="post" enctype="multipart/form-data"
  10.             <input type="file" name="file" /> 
  11.             <button>upload</button> 
  12.         </form> 
  13.     </body> 
  14. </html> 

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

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

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

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

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

输出如下:

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

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

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

  1. if($_FILES){ 
  2.     //loop through the csv file into an array 
  3.     $theCSV = array_map('str_getcsv', file($_FILES['file']['tmp_name'], FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)); 
  4.     /*Walk through the array and combine the headers which is the first element of our csv array with the rest of the csv data*/ 
  5.     array_walk($theCSVfunction(&$aryuse($theCSV) { 
  6.         $ary = array_combine($theCSV[0], $ary); 
  7.     }); 
  8.     //dump result 
  9.     var_dump($theCSV); 
  10. ?> 

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

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

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

  1. if($_FILES){ 
  2.     //loop through the csv file into an array 
  3.     $theCSV = array_map('str_getcsv', file($_FILES['file']['tmp_name'], FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)); 
  4.     /*Walk through the array and combine the headers which is the first element of our csv array with the rest of the csv data*/ 
  5.     array_walk($theCSVfunction(&$aryuse($theCSV) { 
  6.         $ary = array_combine($theCSV[0], $ary); 
  7.     }); 
  8.     //remove column headers which is the first element 
  9.     array_shift($theCSV); 
  10.     //dump result 
  11.     var_dump($theCSV); 

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

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

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

  1. function readCSV($file){ 
  2.     if(emptyempty($file) || !file_exists($file)) return
  3.     //store the column headers 
  4.     $headers = null; 
  5.     $theCSV = array_map('str_getcsv', file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)); 
  6.     /*Walk through the array and combine the headers which is the first element of our csv array with the rest of the csv data*/ 
  7.     array_walk($theCSVfunction(&$aryuse($theCSV, &$headers) { 
  8.             $ary = array_combine($theCSV[0], $ary); 
  9.             //store the headers 
  10.             $headers = $theCSV[0]; 
  11.     }); 
  12.     //remove column headers which is the first element of our csv array 
  13.     array_shift($theCSV); 
  14.     //return data 
  15.     return array
  16.         "headers" => $headers
  17.         "data" => $theCSV 
  18.     ); 

3. 将数据写入 CSV 文件

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

  1. if($_SERVER['REQUEST_METHOD'] == "POST"){ 
  2.     $file = "./my_csv_file.csv"
  3.     //loop through the csv file into an array 
  4.     $csvData = readCSV($file); 
  5.     //create array to store the new data 
  6.     $newData = []; 
  7.     //loop through headers and then add values as a new array 
  8.     foreach($csvData['headers'as $index => $key){ 
  9.         if($key == 'Full Name'){ 
  10.             $newData[$key] = $_POST['full_name']; 
  11.         }elseif($key == 'Email'){ 
  12.             $newData[$key] = $_POST['email']; 
  13.         }elseif($key == 'Phone'){ 
  14.             $newData[$key] = $_POST['phone']; 
  15.         }else
  16.             $newData[$key] = ''
  17.         } 
  18.     } 
  19.     var_dump($newData); 

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

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

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

  1. if($_SERVER['REQUEST_METHOD'] == "POST"){ 
  2.     $file = "./my_csv_file.csv"
  3.     //loop through the csv file into an array 
  4.     $csvData = readCSV($file); 
  5.     //create array to store the new data 
  6.     $newData = []; 
  7.     //loop through headers and then add values as a new array 
  8.     foreach($csvData['headers'as $index => $key){ 
  9.         if($key == 'Full Name'){ 
  10.             $newData[$key] = $_POST['full_name']; 
  11.         }elseif($key == 'Email'){ 
  12.             $newData[$key] = $_POST['email']; 
  13.         }elseif($key == 'Phone'){ 
  14.             $newData[$key] = $_POST['phone']; 
  15.         }else
  16.             $newData[$key] = ''
  17.         } 
  18.     } 
  19.     //open the csv file as in append mode 
  20.     $fp = fopen($file'a+'); 
  21.     //remove keys from new data 
  22.     $newData = array_values($newData); 
  23.     //append data to csv file 
  24.     fputcsv($f$newData); 
  25.     //close the resource 
  26.     fclose($fp); 

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

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

Tags: PHP读取CSV PHP写入CSV

分享到: