Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    42

    fputcsv scrive sulla riga sottostante invece che su quella attuale

    Ciao a tutti,
    ho un file csv che contiene dei dati. Tramite PHP devo andare alla ricerca di un particolare valore che so essere in prima posizione in una delle righe del file. A priori non so però in quale riga.

    Quindi, apro il file csv e lo spanno riga per riga. A un certo punto troverò il valore; una volta individuato, sostituirò l'intera riga che lo contiene con un array da me definito preventivamente.
    Codice PHP:
    $valore 0// ...da definire
    $newRow = array(); // ...da definire
    $file fopen('mydata.csv''r+');
    while(!
    feof($file)) {
        
    $row fgetcsv($file);
        if(
    $row[0] == $valore) {
            
    fputcsv($file$newRow);
            break;
        }
    }
    fclose($file); 
    Il problema è che il codice, una volta individuato il valore, non va a sovrascrivere la riga che lo contiene ma la riga sotto! Non capisco bene il perché, ma ho l'impressione che il problema risieda in un cattivo uso della funzione fputcsv (vedi codice sopra).

  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    E' normale che sia così. Una volta che hai letto la riga, il puntatore del file si trova sul primo carattere dopo la riga letta (l'inizio della nuova riga).
    Dovresti tornare indietro di un numero di byte che compongono la riga letta:

    Codice PHP:
    $valore 0// ...da definire 
    $newRow = array(); // ...da definire 
    $file fopen('mydata.csv''r+'); 
    while(!
    feof($file)) { 
        
    $row fgetcsv($file); 
        if(
    $row[0] == $valore) { 
            
    fseek($file, -mb_strlen($row) , SEEK_CUR);
            
    fputcsv($file$newRow); 
            break; 
        } 

    fclose($file); 
    Comunque, questo è corretto se la dimensione della nuova riga è la stessa di quella vecchia:
    Se è più piccola potresti ritrovarti il pezzo finale della vecchia riga
    Se più grande, finirai per mangiarti il pezzo iniziale della riga ruccessiva

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    42
    Originariamente inviato da boots
    E' normale che sia così. Una volta che hai letto la riga, il puntatore del file si trova sul primo carattere dopo la riga letta (l'inizio della nuova riga).
    Dovresti tornare indietro di un numero di byte che compongono la riga letta:

    Codice PHP:
    $valore 0// ...da definire 
    $newRow = array(); // ...da definire 
    $file fopen('mydata.csv''r+'); 
    while(!
    feof($file)) { 
        
    $row fgetcsv($file); 
        if(
    $row[0] == $valore) { 
            
    fseek($file, -mb_strlen($row) , SEEK_CUR);
            
    fputcsv($file$newRow); 
            break; 
        } 

    fclose($file); 
    Comunque, questo è corretto se la dimensione della nuova riga è la stessa di quella vecchia:
    Se è più piccola potresti ritrovarti il pezzo finale della vecchia riga
    Se più grande, finirai per mangiarti il pezzo iniziale della riga ruccessiva
    Grazie, sei stato veramente chiarissimo!
    Quindi in pratica voglio fare una cosa impossibile, visto che non si può essere sicuri del risultato?

  4. #4
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    In pratica si...ti conviene fare così:

    1. Apri il file .csv in lettura ed un secondo in scrittura
    2. Leggi riga per riga il file csv e copialo in quello nuovo
    3. Quando trovi la riga che cerchi, fai le modifiche e la scrivi nel file nuovo
    4. Continui a copiare le righe dal vecchio al nuovo file
    5. Cancelli il file .csv e rinomini il secondo

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    42
    Originariamente inviato da boots
    In pratica si...ti conviene fare così:

    1. Apri il file .csv in lettura ed un secondo in scrittura
    2. Leggi riga per riga il file csv e copialo in quello nuovo
    3. Quando trovi la riga che cerchi, fai le modifiche e la scrivi nel file nuovo
    4. Continui a copiare le righe dal vecchio al nuovo file
    5. Cancelli il file .csv e rinomini il secondo
    Geniale!
    Certo che questa cosa è prorio assurda... ma non ho scelta! Grazie mille

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.