2012-10-31 8 views
6

Ho una textarea che invia al mio database su un sito web che funziona correttamente. Ma quando creo un CSV (tramite PHP) dal mio database, tutte le interruzioni di riga si confonderanno con il CSV risultante. Qualsiasi lettore CSV interpreterà l'interruzione di riga dall'input in una nuova riga.Come posso eliminare tutte le interruzioni di riga per generare un CSV corretto?

ho provato i seguenti approcci:

  1. incapsulando i campi tra virgolette.

  2. questo:

    $field = str_replace(array('\n', '\r', '\r\n', '\n\r'), ',', $original_field); 
    
  3. anche questo:

    $field = strip_tags(nl2br($original_field)); 
    
  4. Combinando tutti gli approcci di cui sopra.

In ogni caso, il risultato finale sarà ancora un CSV incasinato che si romperà su un'interruzione di linea immessi dall'utente. Sono riuscito a bloccare le nuove interruzioni di riga dall'area di testo, ma ci sono molte presentazioni legacy che hanno bisogno di me per risolvere questo problema anche sul lato CSV.

Perché non funziona? Come posso risolvere questo problema?

+0

Come si sta creando il CSV? –

+0

Le voci del database sono già in formato CSV? –

+0

No. Sto generando tramite fwrite. Ma dopo aver letto le risposte, potrei ripensare e generare tramite putcsv. –

risposta

10

Prima risposta accettata (di utente user1517891) non è corretta, sostituirà nella stringa due volte, quando c'è \r\n ... Essa sostituirà come due virgole ,. Innanzitutto sostituirà \r =>,, quindi \n =>,.

È necessario utilizzare in modo diverso, come:

$field = str_replace(array("\r\n", "\n\r", "\n", "\r"), ',', $original_field); 
2

Devi mettere \n e tag simili tra virgolette altrimenti saranno trattati come semplici stringhe e non come interruzioni di riga.

7

Utilizzare le virgolette doppie:

$field = str_replace(array("\n", "\r", "\r\n", "\n\r"), ',', $original_field); 
+2

Questo non è corretto. – Legionar

1

Se si utilizza fputcsv() questo problema non dovrebbe nemmeno esistere:

fputcsv($f, array($field1, $field2, $field3)); 

Di default usa virgola come delimitatore e le doppie virgolette come il recinto stringa.

+0

Anch'io ci ho pensato, ma non ha specificato molto sull'output; lo chiama CSV, ma non sappiamo nulla di come viene elaborato dall'input. Data la virgola che ha usato nella stringa di sostituzione nel suo codice, sembra possibile che l'input dell'utente sia già una linea in formato CSV? Il che significherebbe che 'fputcsv()' non è la soluzione al suo problema immediato. Leggendo tra le righe, sembra probabile che il suo codice possa essere semplificato usando 'fputcsv()', ma probabilmente sarebbe un cambiamento abbastanza significativo nel modo in cui sta facendo le cose ora. – SDC

2

Suggerirei di utilizzare preg_replace() per questo anziché str_replace(). Il motivo è che potrebbero esserci più righe nuove e combinazioni di \r e \n e mi aspetto che tu voglia sostituirle tutte con una sola virgola.

Vorrei anche suggerire di utilizzare trim() per rimuovere righe vuote finali.

$field = preg_replace('/[\n\r]+/', ',', trim($original_field)); 
Problemi correlati