2016-10-25 4 views
1

J'ai les données suivantes (ou quelque chose comme ça):Choisissez-texte spécifique d'un fichier texte en utilisant des expressions régulières dans SAS

DATA test2; 
INPUT STRING $31. ; 
PUT STRING; 
DATALINES; 

James Bond is a spy 
Hello World 
123 Mill st P BOX 223 
11 prospect ave p o box 

P Box 225 
Hello World 
pobox 2212 

P. O. box. 256 
; 
run; 

Je voudrais lire seulement les lignes qui commencent par « Bonjour tout le monde "jusqu'à la prochaine ligne, de sorte que ma sortie serait

Hello World 
123 Mill st P BOX 223 
11 prospect ave p o box 

Hello World 
pobox 2212 

mon idée est de faire ensuite des manipulations sur chacun de ces deux textes (ou en général plus), et les ajouter ensuite ensemble. Mais d'abord je dois seulement filtrer le texte dont j'ai besoin. note que mon fichier texte original est énorme, et où les espaces viennent, je ne sais pas.

Ma tentative suivante est la suivante:

data test3; 
set test2; 
if _n_=1 then do; 
retain startline endline; 
startline = prxparse('/Hello World/'); 
endline = prxparse('/^\s/'); 
end; 

if (prxmatch(startline,STRING)=1 or prxmatch(endline,STRING)=1) ; 
run; 

Il me donne la sortie suivante, mais je dois le reste aussi ...:

output

EDIT: Je dois souligner qu'il pourrait y avoir des lignes vides partout dans le texte, mais je ne veux que l'information entre "Hello World" et le suivant ligne vide

Répondre

2

Vous devez vérifier le début et la fin séparément et conserver le drapeau.

EDIT: De cette façon, seules les lignes de données souhaitées sont émises. La concaténation doit être effectuée dans une étape séparée.

data test3; 
set test2; 

if _n_=1 then do; 
retain startline endline start ; 
startline = prxparse('/Hello World/'); 
endline = prxparse('/^\s/'); 
end; 

if prxmatch(endline,STRING) then start = 0; 
else if prxmatch(startline,STRING) then start = 1; 
if start then output; 

run; 

Avec concaténation:

data test3; 
set test2; 

if _n_=1 then do; 
retain startline endline start OUTPUT; 
length OUTPUT $3000; 
startline = prxparse('/Hello World/'); 
endline = prxparse('/^\s/'); 
end; 

if prxmatch(endline,STRING) and OUTPUT ne "" then do; /* check for endline - output string as observation and reset */ 
    output; 
    start = 0; 
    OUTPUT = ""; 
end; 

if start then do; 
    /* Add text manipulation here */ 
    OUTPUT = catx(" ",OUTPUT,STRING); /* concat string */ 
end; 

if prxmatch(startline,STRING) then start = 1; /* check for startline */ 

keep output; 

run; 
+0

Cela ne me donne pas la sortie désirée – Erosennin

+0

Ah, je vois ce que vous avez fait, vous avez concaténé la sortie en deux lignes ... OK – Erosennin

+0

Lorsque vous dites "append" n'entendiez-vous pas concaténer le texte? Aussi: la ligne de salut devrait-elle être incluse ou exclue? – Jetzler

2

Je pense que j'obtiens la sortie désirée en utilisant ce code.

data test3; 
set test2; 
retain outputflag; 
if find(upcase(string),'HELLO WORLD') then outputflag=1; 
if outputflag then output; 
if string='' then outputflag=0; 
run; 
+0

Merci de contribuer! Très appréciée! – Erosennin