Avatar billede ps Nybegynder
07. januar 2000 - 14:00 Der 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?

På forhånd tak
Avatar billede gollum Nybegynder
07. januar 2000 - 14:30 #1
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:

if INDEX(record,'tekst-streng') =0 then delete;

hvis den ønskede karakterstreng er 'tekst-streng'

Håber det kan bruges




Avatar billede gollum Nybegynder
07. januar 2000 - 14:42 #2
Evt. kunne betingelsen lægges ind som en WHERE klausul i DATA, så kun linjerne med tekst-strengen i belv indlæst:

DATA log;
  INFILE 'logfil.log' DLM=';';
    INPUT record $;
    WHERE INDEX(record,'tekst-streng')> 0;
  RUN;

Jeg ved så ikke præcist hvor WHERE skal stå.
Avatar billede ps Nybegynder
07. januar 2000 - 14:43 #3
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).

/PS
Avatar billede hykkelbjerg Nybegynder
13. januar 2000 - 15:13 #4
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
Avatar billede gertnissen Nybegynder
16. januar 2000 - 13:55 #5
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.
Avatar billede ps Nybegynder
17. januar 2000 - 10:33 #6
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 
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester