Vai al contenuto

Utilizzo regular expressions in SysVsscanf

Home Forum Programmazione IEC 61131 (LogicLab) Utilizzo regular expressions in SysVsscanf

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Autore
    Post
  • #77643
    Anonimo
    Inattivo

    Stò cercando di utilizzare la funzione SysVsscanf per estrarre del testo in mezzo a una sequenza di caratteri, ma non riesco a delimitare la ricerca all’interno del primo separatore “;”.

    Il campo da trovare è in un file di testo dove in ogni riga vi è un elenco di parametri. Ecco un estratto del file, la prima riga è il titolo dell’elenco mentre nele righe successive ci sono i campi da decodificare.

    Description;Node;Type;Value;Name
    InputCard; 1; 2; 3; Card name

    Nel mio caso devo estrarre la descrizione (Quindi il testo da inizio riga fino al carattere “;”).

    #77648
    Sergio Bertana
    Amministratore del forum

    Ho realizzato un semplice programma di esempio dove per estrare la descrizione ho utilizzato le regular expressions, poi ho estratto tutti gli altri campi eseguendo la funzione SysStrFind per la ricerca ricorsiva dei separatori “;”.

    PROGRAM FieldsExtract
    VAR
        i : UDINT; (* Auxiliary variable *)
        APtr : @STRING; (* Auxiliary pointer *)
        Title : @STRING; (* Title field *)
        Record : @STRING; (* Record field *)
        Description : STRING[ 32 ]; (* Description *)
        Node : USINT; (* Node *)
        Type : USINT; (* Type *)
        Value : USINT; (* Value *)
        Name : STRING[ 32 ]; (* Name *)
    END_VAR
    
        Title:=ADR('Description;Node;Type;Value;Name'); //Title field
        Record:=ADR('InputCard; 1; 2; 3; Card name'); //Record field
    
        i:=SysVsscanf(Record, ADR('%32[^;]'), STRING_TYPE, ADR(Description));
    
        APtr:=SysStrFind(Record, ADR(';'), FIND_GET_END);
        IF (APtr = eNULL) THEN RETURN; END_IF; //Error
           i:=SysVsscanf(APtr, ADR('%d'), USINT_TYPE, ADR(Node));
    
        APtr:=SysStrFind(APtr, ADR(';'), FIND_GET_END);
        IF (APtr = eNULL) THEN RETURN; END_IF; //Error
        i:=SysVsscanf(APtr, ADR('%d'), USINT_TYPE, ADR(Type));
    
        APtr:=SysStrFind(APtr, ADR(';'), FIND_GET_END);
        IF (APtr = eNULL) THEN RETURN; END_IF; //Error
        i:=SysVsscanf(APtr, ADR('%d'), USINT_TYPE, ADR(Value));
    
        APtr:=SysStrFind(APtr, ADR(';'), FIND_GET_END);
        IF (APtr = eNULL) THEN RETURN; END_IF; //Error
        i:=SysVsscanf(APtr, ADR('%32[ a-zA-Z]'), STRING_TYPE, ADR(Name));

    Come si vede nella acquisizione delle variabili stringa ho utilizzato la sintassi %nn dove si indica la dimensione della variabile di appoggio del risultato per evitare di sforarne la dimensione. SE la stringa è più lunga verrà troncata al valore indicato.

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Devi essere connesso per rispondere a questo topic.