2010-11-01 8 views
3

J'ai un fichier .csv avec 4 colonnes. Quelle est la manière la plus simple de supprimer une ligne identique à l'identifiant de la première colonne? Voici où je suis resté coincé:Supprimer une ligne du fichier CSV

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); 
} 

Malheureusement, les bases de données n'étaient pas un choix.

Répondre

-1
$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); 
} 
+3

Tu oublies la partie où vous écrivez le tableau csv à un autre fichier. Vous ne voulez pas non plus stocker tout le csv dans un tableau, car cela pourrait entraîner des erreurs de mémoire insuffisante. Mieux vaut écrire le csv de façon incrémentielle. –

0

Vous pouvez faire:

$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; 
    } 
} 

essentiellement vous en cours d'exécution a jeté chaque ligne et vérifier si l'ID ne pas correspondre à l'ID envoyé dans le paramètre get, si elle ne pas il écrit la ligne dans le nouveau conteneur/variable.

Et puis réécrire la valeur $new au fichier, cela devrait fonctionner ok:

  • Quelle est la taille du fichier
  • Avez-vous un en-tête CSV en ligne 0?
2

J'ai récemment fait une chose similaire dans un bulletin d'information désabonnement, voici mon code:

$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; 
} 

celui-ci utilise la méthode de fichier temporaire d'écrire la ligne csv par ligne pour éviter les erreurs de mémoire. Ensuite, une fois le nouveau fichier créé, il supprime l'original et renomme le fichier temporaire.

Vous pouvez modifier ce code afin qu'il ressemble à une carte d'identité au lieu d'une adresse e-mail par exemple:

$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'); 
2
$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'); 
Questions connexes