我昨天才开始使用 PHP,所以在代码不好的地方请原谅我。
我有一个名为 .csv 的文件employee_data.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 文件中的选定记录,但在我担心删除部分之前,我只想弄清楚如何用具有相同详细信息的新员工详细信息.csv 覆盖员工详细信息.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/200125689514W847
字符串数组的内容 $parts Array ( [0] => JANE WILLIAMS6/8/199855846874E4321 2 => PETER JONES15/01/198256897547Q1234 2 => JAMES O'BRIEN09/0515609/055/87)
然后我删除了原始的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
,詹姆斯·奥布莱恩09/05/200125689514W8475
,
在新的 csv 文件中,现在有 4 条记录,最后一条不包含任何内容,我不确定为什么要添加它。我只想在名称、dob 和 ppsn 后面加一个逗号。每条记录的最后 4 位数字是一个 pin。
有没有更有效的方法来覆盖 csv 文件?有什么方法可以实现我想要实现的目标吗?在过去的一个小时里,我一直在处理新文件的格式,这是迄今为止我想出的最好的。
例如,您使这种方式变得更加困难,然后就需要这样做
<?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
我们可以一次性删除旧文件,删除新文件并将新文件重命名为旧文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句