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>
当我使用上面的代码上传文件时,输出以下数据:
如图所示,每个字符串中都有逗号,每个逗号将一条信息与另一条信息隔开。
使用 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);
}
输出如下:
输出的数据看起来比之前要好得多,我们将列标题(全名、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 数组现在的样子:
注意这里有个问题:这个新数组的第一个元素是表头,因为我们之前让它与 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 数组的样子
将上面的代码封装成一个函数,如下:
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 文件的数组的数据
在我们将这些数据写入到 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 文件当中去了。
来源:https://juejin.cn/post/7221408294237208637


猜你喜欢
- 字体的处理在网页设计中无论怎么强调也不为过, 毕竟网页使用来传递信息的, 而最经典最直接的信息传递方式就是文字,&nbs
- 回滚段管理一直是ORACLE数据库管理的一个难题,本文通过实例介绍ORACLE回滚段的概念,用法和规划及问题的解决。 回滚段概述 回滚段用于
- 大概在九九年做游戏网站的时候,就对文章的发布感到麻烦,不过那会儿玩ASP不精。只是将就用着。在遇到长文件 10000 字时网页就是一大片长了
- SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研
- 从publish 表中取出第 n 条到第 m 条的记录的sql语句写法:SELECT TOP m-n+1 *&
- 下面是代码,如果看不懂,建议先把表格的一些<tr><td>的表格原理弄清楚了,就可以了代码如下:<table&
- 于是写测试程序。。。不行 下载最新的ODBC。。。还是不行 通过sql plus查询。。。咦?竟然也查不到。。。 于是,折腾。。。折腾。。。
- 研究编码,得知GB2312编码与区位码的关系,尝试之后,得此程序。搜索,似乎没人写,故发此地。1.简述(1)GB2312标准的定义,其实就是
- 常用Mysql查询语句记录一、授权1.授权本地用户对所有数据库具有所有权限> grant all privileges on
- Java Java 是由 Sun 公司开发而成的一种编程语言,利用 Jave 写成的小程序叫做 Java
- 因为一个需求,因为自己想多了一点东西,最后发现了一个问题,一个很奇怪的问题。这个问题我想还是我自己当初想法上的出路导致的吧,但想不通为什么会
- 在开发C/S结构的大型数据库应用软件时,一般情况下,软件开发人员和数据库设计人员并不是同一个人,这就需要协商好一些即可由程序设
- 传统行业里,缺做互联网资深的人;互联网行业里,缺玩传统业务资深的人。于是会造成很多问题,比如两边难沟通,在传统行业者心目中,网络营销e-Ma
- 按照本文操作和体会,会对sql优化有个基本最简单的了解,其他深入还需要更多资料和实践的学习: 1. 建表: 代码如下:creat
- 使用css2.1实现多重背景、多重边框效果在单个HTML元素上利用CSS2.1实现拥有3张背景图片和2张内容图效果,或者多重边框的效果。这种
- 内容摘要:ASP开发人员为了在他们的设计项目中获得更好的性能和可扩展性而不断努力。幸运地是,有许多书籍和站点在这方面提供了很好的建议。但是这
- 以下虚线框内为mk.asp文件的具体代码:<%filename="test.htm"if request
- 如何用我的国际域名做虚拟域名?config.asp<%Domain_URL = "intels.net&
- ChatGPT 是 OpenAI 开发的 GPT(Generative Pre-trained Transformer)语言模型的变体。它是
- 类的定义 类定义有三种基本方法,1、创建并能返回特定类型的对象的函数(工厂函数),例如:function Co(){ var o = new