Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di tapu
    Registrato dal
    May 2008
    Messaggi
    885

    modificare i valore di un csv dopo averlo caricato in array

    ciao , sono riuscito a visualizzare il file csv , lo inserito in un array , ma ora il problema è quello di modificare i valori al suo interno.

    dovrei modificare o tutta la linea o solo alcune parti; un po come si fa con UPDATE SET di sql.

    si può fare ? e come dovrei procedere?
    vi posto lo script che per ora ho scritto
    codice:
    $file = [oath del file.csv];
    $seek = fseek ($apro , "0");
    $lung = filesize($file); 
    $apro = fopen ($file , "r");
    for ($i = 0 ; $i < 8 ; $i++){
    $prendo[$i] = fgetcsv($apro ,$lung , ";");
    $valore = array (a => $prendo[$i][0]) //continuo cosi per tutto larray
    if (isset($valore[id])){
    $ragpost = $_POST['rag'] ; $ragvalore = $valore['rag'];
    if ($ragpost === $ragvalore){
    //QUI DOVREI MODIFICARE I VALORI...
    }
    }
    }
    se non è possibile modificare i valori tra ; stavo pensando di cancellare la righa e ristamparla con i valori modificati . ma non mi sembra una gran cosa ...
    qualcuno sa come potrei procedere?

    grazie in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    mmh.. non ho ben capito il tuo problema... infatti normalmente si procede con la creazione ex-novo dell'intero file (a meno di situazioni molto particolari o file davvero ENORMI) che viene poi riscritto su disco... modificarne una parte non ha molto senso... dovresti "scrivere" direttamente su disco nella parte interessata, ma questo può funzionare bene solo se hai campi a lunghezza fissa (è forse così? In ogni caso dovresti gestire teoricamente le incongruenze, in linea di massima se per esempio capita che si "blocca" la scrittura "a metà" potresti avere uno stato inconsistente, mentre riscrivendo l'intero file "di colpo" lasci normalmente questo compito al file system)...

  3. #3
    Utente di HTML.it L'avatar di tapu
    Registrato dal
    May 2008
    Messaggi
    885
    io ho un file che verrà scritto ogni volta che qualcuno inserirà i dati nel form.
    i dati vengono scritti contemporaneamente sul file e sul db.
    ovviamente si tratta di campi quindi so con esattezza quanti saranno ed anche a quale lunghezza massima potranno avere.

    il fatto e che ogni qul volta uno decida di fare una modifica il file dovre prendere queste modifiche cambiando i campi che un utente ha deciso di modificare.

    non mi interessa che il file venga riscritto o che solo la riga prenda la modifica .

    esempio :

    1;1;via longo 1;napoli;na;;;;A112
    2;1;via tommasini 12;napoli;na;;;;S192
    3;1;via roaschia 121;roma;ro;;;;L2
    4;1;c.so romania 132;genova;ge;;;;G23

    voglio modificare la riga 3 in :

    3;1;c.so brunelleschi 23;;roma;ro;;;;L2

    il risultato dovrà essere :

    1;1;via longo 1;napoli;na;;;;A112
    2;1;via tommasini 12;napoli;na;;;;S192
    3;1;c.so brunelleschi 23;;roma;ro;;;;L2
    4;1;c.so romania 132;genova;ge;;;;G23

    poi che venga riscritto il file , da 0 cambiando solo la 3 riga oppure cambiare solo la righa poco importa...
    Ma non so come procedere a cancellare la riga oppure a modificarla.
    Il file dovrà avere lo stesso nome di quello gia esistente ...

    grazie!

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    Codice PHP:
    // FILE CSV ESTERNO:
    $FILECSV '.../percorsofile/nomefile.csv';
    $righe = array();

    // LETTURA:
    $fp fopen($FILECSV"r");
    while ((
    $data fgetcsv($fp0";")) !== false) {
      
    $valori fgetcsv($fp0';');
      
    $righe[] = $valori;
    };
    fclose ($fp);

    // MODIFICA:
    // $righe CONTIENE LE RIGHE, es.:
    // $righe[0][0] = '1';
    // $righe[0][1] = 'via longo 1';
    // ...
    // FAI LE MODIFICHE CHE VUOI DIRETTAMENTE NEL VETTORE $righe

    // SCRITTURA:
    $fp fopen($FILECSV"w");
    foreach (
    $righe as $riga) {
        
    fputcsv($fp$riga';');
    }
    fclose ($fp); 

  5. #5
    Utente di HTML.it L'avatar di tapu
    Registrato dal
    May 2008
    Messaggi
    885
    Ho seguito più o meno la tua traccia e non solo...
    ho tirato fuori ciò :
    Codice PHP:
    $file ="debitori/$_SESSION[nomeut]-$_SESSION[fisc].csv";
    $apro fopen($file"r");
    $cambio = array (=> $_SESSION['id'] , => $_POST['cli'] , 2=> $_POST['rag']  ,3=> $_POST['ind']  ,4=>$_POST['cit']  ,5=>$_POST['pro']  ,6=> $_POST['zip'] ,7=> $_POST['te1'],8=> $_POST['te2'],9=> $_POST['fax'],10=> $_POST['mai'],11=> $_POST['iva'],12=> $_POST['fis'],13=> $_POST['rif'],14=> $_POST['dri'] ,15=> $_POST['dre']);
    $rag=$_POST['rag'];
    $data = array();
    if (isset (
    $rag)){
    $vettore file($file);
    $counter count($vettore);
    $vett fgetcsv($apro0";");
        
    $numcampi count($vett);
        for (
    $i=0;$i<$counter;$i++){
        
    $esplosione explode(";"$vettore[$i]);
        
    $data[$i] = $esplosione;
        }
        for (
    $c $c <= $counter $c++){
          for (
    $j =  $j <= $numcampi ;$j++){
          [
    COLOR=RED]  if ($data[$c][$j] === "$rag"){[/COLOR]
                
    $sostituzione array_splice($vettore$vettore[$c], count($vettore[$c]), $cambio);
                break;
             }
         }
        }
    $vettoreimploso = array(implode(";",$vettore));
    $data $vettoreimploso;
    $counter_2=count($data);
    $fpf2 fopen($file"w+");
    for (
    $s $s $counter_2 $s++){
    $fw2 fwrite($fpf2"$vettoreimploso[$s]\n");
    }
    if (
    $fw2){
        echo 
    "ha scritto " $vettoreimploso;
    }
    fclose($fpf2);
    fclose($apro);

    ho riscontrato un 'problemino' che non riesco a rimettere a posto.
    Ho cercato di fare ciò:
    apro il file e lo tratto come se fosse un array, inserisco i dati esplosi.
    in un'altro array ($cambio) prendo tramite post i valori che dovrò modificare.
    prendo da $cambio l'unico paramentro univoco per fare il confronto con $data.
    se esiste l'uguaglianza tra i 2 sostituisco l'array con array_split e poi riscrivo il file da 0.

    Il problema penso che sia proprio sulla condizione if in rosso.
    il risultato è una bella sostituzione ma non nel posto in cui voglio; sembra che al posto di eliminare la linea giusta mi elimina quelle precedenti .
    non so se mi sono spiegato , mi sto perdendo

    grazie dell'aiuto io sto

  6. #6
    Utente di HTML.it L'avatar di tapu
    Registrato dal
    May 2008
    Messaggi
    885
    Forse ho risolto :

    Codice PHP:
    //apro il file
    $file ="debitori/$_SESSION[nomeut]-$_SESSION[fisc].csv";
    $apro fopen($file"r");
    //importo tramite il metodo prescelto i vari campi e li inserisco in un array
    $cambio = array (=> $_SESSION['id'] , => $_POST['cli'] , 2=> $_POST['rag']  ,3=> $_POST['ind']  ,4=>$_POST['cit']  ,5=>$_POST['pro']  ,6=> $_POST['zip'] ,7=> $_POST['te1'],8=> $_POST['te2'],9=> $_POST['fax'],10=> $_POST['mai'],11=> $_POST['iva'],12=> $_POST['fis'],13=> $_POST['rif'],14=> $_POST['dri'] ,15=> $_POST['dre']);
    $rag=$_POST['rag'];
    //carico un array che mi servira come appoggio
    $data = array();
    if (isset (
    $rag)){
    //carico il file in un vettore
    $vettore file($file);
    //conto le righe del file passate in un vettore (5 righe 5 vettori)
    $counter count($vettore);
    //carico un altro vettore con i singoli campi della prima riga divisi da ;
    $vett fgetcsv($apro0";");
    //conto i singoli campi della riga scomposti in un vettore
        
    $numcampi count($vett);
    //ciclo il vettore e lo espando
        
    for ($i=0;$i<$counter;$i++){
        
    $esplosione explode(";"$vettore[$i]);
    //carico in data ogni singola esplosione
        
    $data[$i] = $esplosione;
        }
    //$data è un array bidimensionale , lo ciclo per tutta la sua grandezza
        
    for ($c $c <= $counter $c++){
          for (
    $j =  $j <= $numcampi ;$j++){
    //se un campo è uguale al paramentro di confronto
            
    if ($data[$c][$j] == "$rag"){
    //lo ricompongo e lo inserisco in un'arrai (tutti i campi uniti n un array solo)
                
    $implosionecambio implode(";"$cambio);
                
    $sostituzione array_splice($vettore$vettore[$c], count($vettore[$c]), $implosionecambio);
                
    $sostituzione = array($cambio);
                break;
             }
         }
        }
    //scrivo il mio array con la sostituzione 
    $fpf2 fopen($file"w+");
    foreach (
    $vettore as $vettoriale){
    $fw2 fwrite($fpf2"$vettoriale");
    }
    if (
    $fw2){
    //stampo a video le mie righe
        
    foreach ($vettore as $vettoriale)
        echo 
    $vettoriale "\n";
    }
    //chiudo sia lettura che scrittura
    fclose($fpf2);
    fclose($apro);

    Ora dovrebbe funzionare !

    grazie a tutti... ciao

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.