2013-05-04 18 views
5

Ho un grande file CSV. Voglio separare questo file in file separati in base al valore in uno dei campi.Come posso dividere un file CSV in PHP?

Questo è quello che ho fatto. Usando fgetcsv, converto il CSV in un array e, usando in_array, controllo il contenuto e visualizzo se contiene la stringa all'interno dell'array.

Riceverò la stringa di confronto da un altro file di testo iterativamente per verificare se è contenuta nel csv. In questo caso l'ho specificato come "Test".

Di seguito si riporta il codice:

if (($handle = fopen("test.csv", "r")) !== FALSE) { 
     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 

      if(in_array("Testing", $data)) 
      { 
       var_dump($data); 
      } 
     } 

     fclose($handle); 
    } 

Questo è il lavoro, ma ora mi sono bloccato. Come posso scrivere $data in un altro file CSV? O c'è un modo migliore per farlo?

+0

correlati: http://stackoverflow.com/questions/9645699/copy-file-content-to-un'altro-file – Gordon

risposta

6

In realtà è piuttosto semplice e se la stringa deve solo essere sulla linea, non hanno nemmeno bisogno di fgetcsv. Just

$srcFile = new SplFileObject('test.csv'); 
$destFile = new SplFileObject('new.csv', 'w+'); 
foreach ($srcFile as $line) { 
    if (strpos($line, 'testing') !== FALSE) { 
     $destFile->fwrite($line); 
    } 
} 

Questo creerà due oggetti file. Il primo che contiene il contenuto del tuo file sorgente. Il secondo crea un nuovo file per le righe contenenti la stringa di ricerca. Quindi eseguiamo semplicemente un'iterazione su ogni riga e controlliamo se esiste una stringa di ricerca. Se è così, lo scriviamo nel file di destinazione.

Il file di origine non verrà toccato in questo modo. Se si desidera avere un file con la stringa di ricerca e un file senza, basta creare un terzo SplFileObject e aggiungere un altro blocco al se scrivendo la riga su quello. Alla fine, elimina il file csv di origine.

1

Bisogna fare qualche cosa difficile sto fornendo qualche idea di base per farlo, ecco il codice:

//opening file 
if ($fp = fopen('log.csv', 'r')) { 
    $line_number = 0; 

    //loop for Reading file as line by line csv file 
    while ($line = fgetcsv($fp, 0, ';')) { 
    if ($line_number++ == 0) { 
     continue; 
    } 

    //array data string to make possible to provide file name 
    //according to column name required 
    $date = explode(' ', $line[0]); 

    //Change the column name according to your needs 
    $file = $date[0] .'.log'; 

    file_put_contents(
     //change the folder name according to your needs 
     'monthly/'. $file, 
     //printing data in appended file 
     implode(';', $line) ."\n", 
     FILE_APPEND 
    ); 
    } 

    //closing file 
    fclose($fp); 
} 

Legge linea di file CSV per riga, estratti data parte dalla prima colonna e crea nuovo file e aggiunge i dati ad esso.

Nota:

cartella "mensile" deve essere scrivibile

+0

questo è MOLTO più complicato di quanto deve essere – Gordon

+0

è solo un modo per dividere l'enorme file penso – Vineet1982

Problemi correlati