我昨天才启动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] =&gt; JANE WILLIAMS6 / 8/199855846874E4321 2 =&gt; PETER JONES15 / 01/198256897547Q1234 2 =&gt; JAMES O 'BRIEN09 / 05 / 200125689514W8475 [3] =&gt;)
然后我删除了orignal 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文件的内容。
JANE WILLIAMS,6/8 / 1998,55846874E,4321
PETER JONES,15/01 / 1982,56897547Q,1234
JAMES O'BRIEN,09/05 / 2001,25689514W,8475
相反它看起来像。
JANE WILLIAMS6 / 8 / 199855846874E4321
,PETER JONES15 / 01 / 198256897547Q1234
,JAMES O'BRIEN09 / 05 / 200125689514W8475
,
在新的csv文件中,现在有4条记录,最后一条记录不包含任何内容,我不知道为什么会添加这些记录。我想在名字,dob和ppsn后面加一个逗号。每条记录的最后4位数是一个引脚。
是否有更有效的方法来覆盖csv文件?有没有办法实现我想要实现的目标?过去一小时我一直在搞乱新文件的格式,这是迄今为止我提出的最好的文件。
答案 0 :(得分:1)
你这样做的方式比较困难,例如
<?php
$dataSrc = "persistence/employee_data.csv";
$dataDest = "persistence/new_employee_data.csv";
$dataFile = fopen($dataSrc, "r") or die("Unable to open file!");
$outFile = fopen($dataDest, "w") or die("Unable to open file!");
$i=0; //index for the array
while(false !== ($csv = fgetcsv($dataFile))) {
//$csv = [ANE WILLIAMS,6/8/1998,55846874E,4323];
//add check to remove row
if($csv[2] == '55846874E') continue; //skip to next itteration
fputcsv($outFile, $csv);
}
fclose($dataFile);
fclose($outFile);
//rename($dataDest, $dataSrc); //rename dest to the source name, this will overwrite $dataSrc with $dataDest and remove $dataDest
没有结束标签,没有爆炸,没有垃圾。
这应该(理论上)将$dataFile
的内容逐行写入$outFile
,如果第3列= '55846874E'
,它将跳过写入该行。
例如,通过使用rename
,我们可以删除旧文件,删除新文件并将新文件一次性重命名为旧文件。