Supprimer les sauts de ligne de contenu tsv

J'essaie de nettoyer un file TSV (Copier à partir d'une feuille de calcul Excel) pour la lecture en PHP.

Ce que je dois faire est d'éliminer les sauts de ligne de la partie de contenu du TSV mais pas la rupture de ligne à la fin de chaque ligne, une idée de la façon dont cela peut être réalisé en utilisant la fonction regex ou autre.

Exemple de données (j'ai mis en surbrillance les tabs):

[tab]Some tab seperated data[tab]" Here is some text that someone has used alt+enter to insert a new line into • One. • Two • Three "[tab][tab][tab][tab]Some data[tab][tab]Some other data[final-line-break] 

Edit: Lors d'une enquête plus approfondie, il apparaît si Excel trouve un "dans la valeur de la cellule réelle, elle la délimitera comme" "qui causera des problèmes avec le regex ci-dessous, est-ce que quelqu'un d'autre a une solution?

Ma solution au problème:

 /\n(.+\n[^\t])+.+/ 

Avec le motif ci-dessus, vous pouvez saisir la string exactement entre les citations que vous avez mentionnées.

À partir de là, vous pouvez utiliser la combinaison pré-match et le motif pour saisir la string entre les guillemets. Ensuite, utilisez pré_replace pour replace les nouvelles lignes comme vous le souhaitez.

preg_replace ("/ \ n /", "", $ match);

La difficulté principale est de différencier les guillemets d'ouverture des citations de fermeture.

Vous pouvez utiliser ce rlocation (j'ai mis un # comme string de rlocation uniquement pour voir, vous pouvez évidemment utiliser ce que vous voulez, un espace, une string vide …) :

 $pattern = <<<'EOD' ~ (?: # entry points: (?!\A)\G # - contiguous to a precedent match | # OR (?:^|\t)" #"# - quote preceded by a start of line or a tab ) (?> [^\r\n"\t]+ #"# all execpt tabs, newlines and quotes | "" # escaped quote )* \K # remove all on the left from match result (?: \R # newline | "(*SKIP)(?!) #"# closing quote (skipped) ) ~xm EOD; $data = preg_replace($pattern, '#', $data); 

Le match ne peut commencer qu'avec l'un des deux points d'input. Le premier match utilise le devis d'ouverture, l'utilisation suivante du point d'input (?!\A)\G \G est une ancre pour la fin de la correspondance précédente, mais comme elle peut également correspondre au début de la string, j'ai ajouté (?!\A) qui signifie non suivi du début de la string pour éviter cette possibilité.

Le \K supprime tout ce qui a été corrigé avant le résultat du match. Avec cette astuce, rien sur la gauche n'est remplacé.

\R signifie une nouvelle ligne indépendamment du operating system (cependant, je suppose que c'est probablement \r\n dans votre cas).

" correspondra à la citation de clôture. Mais puisque vous ne voulez pas le replace, je force le motif à échouer avec (?!) (non suivi de rien) .

Le verbe de contrôle de la marche arrière (*SKIP) interdit de réessayer les caractères précédemment en cas de défaillance. C'est très utile car sans lui, la citation de fermeture peut être considérée comme une nouvelle citation d'ouverture selon le model à la prochaine itération. Avec cela, le moteur regex continuera de searchr uniquement après la cote de clôture.