如何覆盖 csv 文件。PHP

凯尔特67

我昨天才开始使用 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 文件?有什么方法可以实现我想要实现的目标吗?在过去的一个小时里,我一直在处理新文件的格式,这是迄今为止我想出的最好的。

注意:我必须更新对我的项目中 csv 文件所做的任何更改,因此如果我从 csv 文件中删除员工记录,我需要一个新的或覆盖的 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章