如何覆盖csv文件。 PHP

时间:2018-02-16 19:34:08

标签: php file csv

我昨天才启动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文件和新表单,而不显示已删除的员工。

删除表格

enter image description here

我想删除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文件?有没有办法实现我想要实现的目标?过去一小时我一直在搞乱新文件的格式,这是迄今为止我提出的最好的文件。

注意:我必须更新我的项目中对csv文件所做的任何更改,因此如果我从csv文件中删除员工记录,我需要一个新的或覆盖的csv文件而没有删除的员工。

1 个答案:

答案 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,我们可以删除旧文件,删除新文件并将新文件一次性重命名为旧文件。