【发布时间】:2018-02-16 19:34:07
【问题描述】:
我昨天才开始使用 PHP,所以请原谅我的代码不佳。
我有一个名为 employee_data.csv 的 csv 文件。它包含格式如下的员工记录。
JANE WILLIAMS,6/8/1998,55846874E,4323
PETER JONES,15/01/1982,56897547Q,1234
JAMES O'BRIEN,09/05/2001,25689514W,8475
员工显示在浏览器的表单上,每行包含员工详细信息,并且表格每行旁边都有一个删除按钮。当用户选择给定员工旁边的删除按钮时,选定的员工将从表单和employee_data.csv 文件中删除,并且新表单将显示而没有删除的员工。
删除表格
我想删除 csv 文件中的选定记录,但在我担心删除部分之前,我只想弄清楚如何用具有相同详细信息的新 employee_details.csv 覆盖 employee_details.csv。
我也想实现这个
1. 将employee_data.csv 文件的内容分解为字符串。
2.将字符串的内容分解成一个数组。
3.删除employee.data.csv
4.创建一个新的employee_data.csv 文件。
5.将数组的内容写入新的employee_data.csv文件
6.将新文件中的员工记录输出到一个表中,每行包含一条员工记录。
$group 数组是一个对象数组,其中每个对象都是来自 employee_data.csv 文件的员工记录。
<?php
$dataFile = fopen("persistence/employee_data.csv", "r") or die("Unable to open file!");
$i=0; //index for the array
while(!feof($dataFile)) {
$csv=fgets($dataFile); //read a line from the CSV file
if(!feof($dataFile)){ //make sure not at end
$employeeProperties=explode(",",$csv); //parse values to an array
$group[$i]=new Employee($employeeProperties[0],$employeeProperties[1],$employeeProperties[2],$employeeProperties[3]);//create new person objects
$i++;
}
}
fclose($dataFile); //close the data file
?>
然后我将 $group 数组的内容分解为字符串,然后将字符串分解为字符串数组。
<?php
$str = implode(array_map(function($x) { return $x->get_employeeName() . $x ->get_dob()
.$x->get_PPSN() .$x->get_PIN().","; }, $group));
echo $str; //implode file objects to string
$parts = explode(',' , $str); //explode to string array
print_r($parts);
?>
$str 中的内容 - JANE WILLIAMS6/8/199855846874E4321 ,PETER JONES15/01/198256897547Q1234 ,JAMES O'BRIEN09/05/200125689514W8475
字符串 $parts 数组的内容 ([0] => JANE WILLIAMS6/8/199855846874E4321 2 => PETER JONES15/01/198256897547Q1234 2 => JAMES O'BRIEN09/05/200125684 3] =>)
然后我删除了原始的employee_data.csv,创建了一个新的employee_data.csv,并将字符串数组写入了csv 文件。
<?php
$file_Path = 'persistence/employee_data.csv';
if(file_exists($file_Path))
{
unlink($file_Path); //delete file
echo 'File Deleted';
}else{
echo 'File Not Exist';
}
$csv_handler = fopen ('persistence/employee_data.csv','w'); //new file
fwrite ($csv_handler,$csv);
fclose ($csv_handler);
$filename = 'persistence/employee_data.csv';
if (file_exists($filename)) {
$datafile = fopen('persistence/employee_data.csv', 'w'); //write to new file
fputcsv($datafile, $parts," ",chr(0));
fclose($datafile);
}
?>
这就是我希望新的employee_data.csv 文件的内容看起来的样子。
简·威廉姆斯,6/8/1998,55846874E,4321
彼得·琼斯,15/01/1982,56897547Q,1234
詹姆斯·奥布莱恩,09/05/2001,25689514W,8475
相反,它看起来像。
简·威廉姆斯6/8/199855846874E4321
, 彼得·琼斯 15/01/198256897547Q1234
, JAMES O'BRIEN09/05/200125689514W8475
,
在新的 csv 文件中现在有 4 条记录,最后一条不包含任何内容,我不确定为什么要添加它。我想在名称、dob 和 ppsn 后面加一个逗号。每条记录的最后 4 位数字是一个 pin。
是否有更高效的方法来覆盖 csv 文件?有什么方法可以实现我想要实现的目标吗?在过去的一个小时里,我一直在搞乱新文件的格式,这是迄今为止我想出的最好的。
注意:我必须更新对我的项目中的 csv 文件所做的任何更改,因此如果我从 csv 文件中删除员工记录,我需要一个新的或覆盖的 csv 文件,而没有删除的员工。
【问题讨论】:
-
而不是
fgets使用fgetcsv和fputcsv,在数据包含逗号并且可能带有新行的情况下使用$parts = explode(',' , $str);将失败,这两种情况都由内置 csv 函数,例如data,"row with, comma", otherstuff,如果你用explode拆分它,你会得到 4 列,如果你使用fgetcsv,你会得到 3