2009-09-02 10 views
0

Ok, je dispose d'un fichier csv comme ceci:Comment remplacer les caractères "nouvelle ligne" entre guillemets dans php?

14 ; 1234,56 ; 10203 ; "ABC" ; "DFG" ; "Lorem \n ipsum \n dolor sit" \n 
15 ; 234,16 ; 10204 ; "ABC" ; "DFG" ; "Lorem \n ipsum \n dolor sit" \n 
16 ; 1234,15 ; 10304 ; "CCC" ; "DFG" ; "Lorem ipsum/dolor \n sit amet\consec" \n 

et ainsi de suite ...

Le fichier a presque 550 000 lignes. Comment remplacer tous les caractères \ n à l'intérieur de guillemets doubles à la fois?

J'utilise PHP 5. Pourrait-il être fait par preg_replace()?

+0

Y at-il \ » à l'intérieur l'une de ces guillemets doubles? – Havenard

+0

Oui, j'ai des barres obliques entre guillemets dans certains dossiers. –

+0

J'aime RegEx, mais dans ce cas, il est pas sûr. – Havenard

Répondre

2

Je ne sais pas si vous utilisez fgetcsv(), mais vous pouvez le configurer pour reconnaître les champs individuels, y compris l'information cité . De cette façon, vous pouvez lire vos lignes une à la fois et supprimer les nouvelles lignes au niveau du champ plutôt que d'avoir à faire une opération RegEx coûteuse sur un gros fichier en une seule fois.

exemple de code php modifié légèrement de la documentation (delimiter remplacé par ';'):

$row = 1; 
$handle = fopen("data.txt", "r"); 
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { 
    $num = count($data); 
    echo "<p> $num fields in line $row: <br /></p>\n"; 
    $row++; 
    for ($c=0; $c < $num; $c++) { 
     echo $data[$c] . "<br />\n"; 
    } 
} 
fclose($handle); 

donnees.txt

14 ; 1234,56 ; 10203 ; "ABC" ; "DFG" ; "text 
text 
more text" 
15 ; 234,16 ; 10204 ; "ABC" ; "DFG" ; "text 
text 
more text" 

Ce sera reconnu comme 2 lignes au lieu de 6 parce que fgetcsv() reconnaîtra les nouveaux caractères de ligne dans les guillemets dans le cadre du champ et non des lignes de données supplémentaires.

+0

fgetcsv() Fonctionne parfaitement, vous remercie En tout cas, je voudrais voir le modèle regex ... –

+0

Heureux d'être de service, je n'ai été exposé qu'à fgetcsv () récemment moi - je ne peux pas vous aider sur le côté RegEx des choses, je peux les utiliser mais je ne suis pas sûr de savoir comment le faire fonctionner pour cette situation. –

0

Donc, avez-vous réellement la chaîne '\n' (pas un nouveau caractère de ligne) sur certaines lignes? Si oui, vous avez juste besoin d'échapper au caractère de nouvelle ligne:

str_replace("\\n", "*foo*", $csv) 

// this will make the following change: 
14 ; 1234,56 ; 10203 ; "ABC" ; "DFG" ; "text \n text \n more text" \n 
// that to this: 
14 ; 1234,56 ; 10203 ; "ABC" ; "DFG" ; "text *foo* text *foo* more text" \n 
0

PHP a une fonction spécifique pour lire les fichiers CSV: fgetcsv();

0

Je suis versé pas trop bien dans regex extrêmement complexe, en supposant Je cherche une conversion en une fois J'écrirais un script rapide pour ouvrir le csv en php, lire le fichier (fgetcsv construit en php5) et écrire (fputcsv) ligne par ligne dans un nouveau fichier tout en str_replace'ing les caractères de nouvelle ligne.

(Si je ne cherchais pas le monstre regex sur stackoverflow, ce qui est.)

Questions connexes