2 votes

Comment replacer la nouvelle ligne et l'alimentation de la ligne d'une manière spécifique ?

J'ai les données ci-dessous dans une colonne appelée "DATA" dans oracle. j'ai essayé de supprimer la nouvelle ligne vide après chaque ligne.

  • Entrée

    This is a text from line 1.
    
    This is text from line 2.
    
    This is a text from line 3.The line 3 ends here .
    
    This is a text from line 4.The line ends here .
  • sortie

    This is a text from line 1.
    This is text from line 2.
    This is a text from line 3.The line 3 ends here .
    This is a text from line 4.The line ends here .

J'ai essayé d'utiliser

Requête :

Select regexp_replace(regexp_replace(data,chr(13),null),chr(10),null) from main_data;

Lorsque j'exécute la requête ci-dessous, le résultat ressemble à un paragraphe.

Ceci est un texte de la ligne 1.Ceci est un texte de la ligne 2.Ceci est un texte de la ligne .La ligne 3 se termine ici .Ceci est un texte de la ligne 4.La ligne se termine ici .

Quelqu'un peut-il nous dire comment y parvenir ?

3voto

Wiktor Stribiżew Points 100073

Vous pouvez utiliser un '(' || chr(13) || chr(10) || '?|' || chr(10) || '){2,}' regex :

select regexp_replace(
    'This is a text from line 1.' || chr(13) || chr(10) || chr(13) || chr(10) || 'This is text from line 2.' || chr(10)  || chr(10) || 'This is a text from line 3.The line 3 ends here .'  || chr(10) || chr(10) || 'This is a text from line 4.The line ends here .',
    '(' || chr(13) || chr(10) || '?|' || chr(10) || '){2,}',
    '\1') as Result from dual

Le motif correspond à 2 ou plusieurs ( {2,} ) répétitions consécutives d'un symbole CR suivi d'une option (1 ou zéro), ? ) ou ( | ) un symbole LF.

La correspondance est remplacée par la dernière occurrence de CRLF, CR ou LF, comme suit \1 est un espace réservé pour la valeur capturée avec le groupe de capture #1 (le premier (...) dans le modèle).

Sortie de la Démonstration en ligne :

enter image description here

0voto

Matt Points 10628

Si les champs sont vides ou NULL utiliser le formulaire ci-dessous.

SELECT DATA
FROM main_data
WHERE DATA IS NOT NULL OR DATA != ''

0voto

Visionary Zen Points 80

Et si vous remplaciez l'occurrence de marqueurs de fin de ligne consécutifs par un seul.

DECLARE

  DATA VARCHAR2(2000);
BEGIN
  DATA := 'This is a text from line 1.' || CHR(13) || CHR(13) ||
          'This is text from line 2.' || CHR(13) || CHR(13) ||
          'This is a text from line 3.The line 3 ends here .' || CHR(13) ||CHR(13) ||
          'This is a text from line 4.The line ends here .';

  dbms_output.put_line(regexp_replace(DATA, chr(13) || CHR(13), CHR(13)));

END;

Vous obtiendrez ainsi

This is a text from line 1.
This is text from line 2.
This is a text from line 3.The line 3 ends here .
This is a text from line 4.The line ends here .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X