У меня есть .csv файл с 4 столбцами. Какой самый простой способ удалить строку, идентичную идентификатору первого столбца? Вот где я застрял:
if($_GET['id']) { $id = $_GET['id']; $file_handle = fopen("testimonials.csv", "rw"); while (!feof($file_handle) ) { $line_of_text = fgetcsv($file_handle, 1024); if ($id == $line_of_text[0]) { // remove row } } fclose($file_handle); }
К сожалению, базы данных не были выбором.
$id = $_GET['id']; if($id) { $file_handle = fopen("testimonials.csv", "w+"); $myCsv = array(); while (!feof($file_handle) ) { $line_of_text = fgetcsv($file_handle, 1024); if ($id != $line_of_text[0]) { fputcsv($file_handle, $line_of_text); } } fclose($file_handle); }
Недавно я сделал аналогичную вещь для подписки на рассылку новостей, вот мой код:
$signupsFile = 'newsletters/signups.csv'; $signupsTempFile = 'newsletters/signups_temp.csv'; $GLOBALS["signupsFile"] = $signupsFile; $GLOBALS["signupsTempFile"] = $signupsTempFile; function removeEmail($email){ $removed = false; $fptemp = fopen($GLOBALS["signupsTempFile"], "a+"); if (($handle = fopen($GLOBALS["signupsFile"], "r")) !== FALSE) { while (($data = fgetcsv($handle)) !== FALSE) { if ($email != $data[0] ){ $list = array($data); fputcsv($fptemp, $list); $removed = true; } } fclose($handle); fclose($fptemp); unlink($GLOBALS["signupsFile"]); rename($GLOBALS["signupsTempFile"], $GLOBALS["signupsFile"]); return $removed; }
это использует метод temp-файла для записи строки csv, чтобы избежать ошибок памяти. Затем, как только новый файл был создан, он удаляет оригинал и переименовывает временный файл.
Вы можете изменить этот код так, чтобы он искал идентификатор вместо адреса электронной почты, например:
$id = $_GET['id']; $fptemp = fopen('testimonials-temp.csv', "a+"); if (($handle = fopen('testimonials.csv', "r")) !== FALSE) { while (($id= fgetcsv($handle)) !== FALSE) { if ($id != $data[0] ){ $list = array($data); fputcsv($fptemp, $list); } } fclose($handle); fclose($fptemp); unlink('testimonials.csv'); rename('testimonials-temp.csv','testimonials.csv');
$table = fopen('table.csv','r'); $temp_table = fopen('table_temp.csv','w'); $id = 'something' // the name of the column you're looking for while (($data = fgetcsv($table, 1000)) !== FALSE){ if(reset($data) == $id){ // this is if you need the first column in a row continue; } fputcsv($temp_table,$data); } fclose($table); fclose($temp_table); rename('table_temp.csv','table.csv');
Ты можешь сделать:
$new = ''; while (!feof($file_handle)) { $line_of_text = fgetcsv($file_handle, 1024); if ($id != $line_of_text[0]) { $new .= implode(',',$line_of_text) . PHP_EOL; } }
в основном вы выполняете бросок каждой строки и проверяете, не совпадает ли идентификатор с идентификатором, отправленным в параметре get, если он не делает этого, он записывает строку в новый контейнер / переменную.
И затем перепишите $new
значение в файл, это должно работать нормально:
0
?