07. januar 2000 - 14:00Der er
5 kommentarer og 1 løsning
Indlæsning af logfil fra domino-server
Jeg har behov for at indlæse en logfil fra en domino-server. Filen har en max. recordlængde på 400 men der er variabel recordlængde. Problemet er, at jeg kun ønsker at indlæse records, der indeholder en bestemt karakterstreng (på 50 karakterer). Denne karakterstreng kan stå et hvilkent som helst sted i recorden.
Er der nogen, der har et bud på hvordan jeg kan lave denne udvælgelse?
Du skriver ikke noget om hvordan log-filen ser ud, men hvis der er kapacitet, kan du så ikke indlæse hele logfilen vha. INFILE. Der må være en seperator mellem hver record, den kan du styre vha. fx. DATA log; INFILE 'logfil.log' DLM=';'; INPUT record $; RUN;
hvor ; er seperator. Nu skulle alle records være indlæst. Så kan du frasortere de records du ikke ønsker vha INDEX:
Tak for rådet, men jeg har det problem når jeg indlæser filen med INFILE, at jeg kun kan indlæse max. 200 karakterer ad gangen (max. længde på char. variabel). Jeg kunne så selvfølgelig indlæse i 2 variable á $ 200 ,men da den tekststreng jeg søger efter kan starte i alt fra pos. 1 - 400 ved jeg ikke hvilken variabel strengen befinder sig i (evt. delvist i begge).
Problemet med at du søger efter en streng i konkateneringen af to andre strenge kan løses på følgende (idiotiske) måde:
data _null_; * a og b er to strenge a' 200 karakterer indlæst fra filen; * (Jeg initialiserer dem blot her til at indeholde test data); a= repeat('a',195) || 'test'; b= 'er om det virker' || repeat('b',195);
* c indeholder nu overlappende information fra a og b under den; * antagelse at søgestrengen (find) ikke er over 50 karakterer; c=substr(a,150) || substr(b,1,50); find='tester om det virker';
if index(a,find)>0 or index(b,find)>0 or index(c,find)>0 then put "Det virker"; run;
if sætningen afgør om søgestrengen i variablen "find" er i konkateneringen af a og b under antagelse af at length(find)<=50
DATA _null_; infile 'logfil.txt' truncover; findtxt = 'bla' input @1 a $200 @200 b $200 @400 c$200; where index(a,findtxt) > 0 or index(b,findtxt) > 0 or index(c,findtxt) > 0; run;
@1 angiver at der skal læses fra position 1 og $200 at der skal læses 200 karaterer ind osv. Du får på den måde 3 var som du så kan søge i ifbm. din where. Du skal ikke bruge DLM, da det jo er en kommansep. fil, men derimod truncover da hver record består ar variabel længde.
Hykkelbjerg SELVFØLGELIG :-) - Dit råd er ikke spor idiotisk for det virker jo og løsningen er ganske simpel (når man altså lige får ideen).
Gertnissen Dit svar afhjælper ikke problemet med at "findtxt" evt. befinder sig delvist i 2 tekstfelter (se min kommentar af 7/1)
Tak for hjælpen PS
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.