Vai al contenuto

Suggerimenti su come eseguire il parsing di una stringa

Home Forum Informazioni ambiente di sviluppo LogicLab Suggerimenti su come eseguire il parsing di una stringa

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

    Qualche suggerimento su come parserizzare questa stringa?

    01G01$1,0002,0,0,0,0,0,0#1,0001,0,0,0,0,0,0#1,000E,5,5,5,5,0,0#1,0004,0,0,0,0,0,0$71

    Quello che dovrei ottenere è una cosa del tipo
    1,0002,0,0,0,0,0,0
    1,0001,0,0,0,0,0,0
    1,000E,5,5,5,5,0,0
    1,0004,0,0,0,0,0,0

    Per poi estrapolare
    0002 e 0 per memorizzarli come 2 e 0
    0001 e 0 per memorizzarli come 1 e 0
    000E e 5 per memorizzarli come 14 e 5
    0004 e 0 per memorizzarli come 4 e 0

    Stavo guardando tra le funzioni stringa ma qualche cosa che assomigli a un “substring” non lo trovo. Mi basta sapere qualche funzione stringa “avanzata”.

    #64024
    Sergio Bertana
    Amministratore del forum

    Provo a buttare giù un’idea utilizzando lo funzioni SysStrFind e SysVsscanf. Ecco il programma StringParse, spero possa servire come base di partenza.

    PROGRAM StringParse
    VAR
        Pos : @BYTE; (* Position *)
        Error : USINT; (* Error number *)
        SString : @STRING; (* Source string *)
        Value : ARRAY[0..3] OF USINT; (* Valiue *)
    END_VAR
    
    // *****************************************************************************
    // PROGRAM "StringParse"
    // *****************************************************************************
    // 01G01$1,0002,0,0,0,0,0,0#1,0001,0,0,0,0,0,0#1,000E,5,5,5,5,0,0#1,0004,0,0,0,0,0,0$71
    //
    // Quello che dovrei ottenere è una cosa del tipo
    // 1,0002,0,0,0,0,0,0
    // 1,0001,0,0,0,0,0,0
    // 1,000E,5,5,5,5,0,0
    // 1,0004,0,0,0,0,0,0
    // 
    // Per poi estrapolare 
    // 0002 e 0 per memorizzarli come 2 e 0
    // 0001 e 0 per memorizzarli come 1 e 0
    // 000E e 5 per memorizzarli come 14 e 5
    // 0004 e 0 per memorizzarli come 4 e 0
    // -----------------------------------------------------------------------------
    
        SString:=ADR('01G01$1,0002,0,0,0,0,0,0#1,0001,0,0,0,0,0,0#1,000E,5,5,5,5,0,0#1,0004,0,0,0,0,0,0$71'); //Source string
    
        // Cerco "$1,"
    
        Pos:=SysStrFind(SString, ADR('$1,'), FIND_MODE#FIND_GET_END); //Position
        IF (Pos = eNULL) THEN Error:=10; RETURN; END_IF;
           IF NOT(SysVsscanf(Pos, ADR('%d'), USINT_TYPE, ADR(Value[0]))) THEN Error:=11; RETURN; END_IF;
    
        // Cerco successiva ","
    
        Pos:=SysStrFind(Pos, ADR(','), FIND_MODE#FIND_GET_END); //Position
        IF (Pos = eNULL) THEN Error:=20; RETURN; END_IF;
           IF NOT(SysVsscanf(Pos, ADR('%d'), USINT_TYPE, ADR(Value[1]))) THEN Error:=21; RETURN; END_IF;
    
        // Cerco "#1,"
    
        Pos:=SysStrFind(SString, ADR('#1,'), FIND_MODE#FIND_GET_END); //Position
        IF (Pos = eNULL) THEN Error:=30; RETURN; END_IF;
           IF NOT(SysVsscanf(Pos, ADR('%d'), USINT_TYPE, ADR(Value[2]))) THEN Error:=31; RETURN; END_IF;
    
        // Cerco successiva ","
    
        Pos:=SysStrFind(Pos, ADR(','), FIND_MODE#FIND_GET_END); //Position
        IF (Pos = eNULL) THEN Error:=40; RETURN; END_IF;
           IF NOT(SysVsscanf(Pos, ADR('%d'), USINT_TYPE, ADR(Value[3]))) THEN Error:=41; RETURN; END_IF;
    
        // ... Eccetera
    
    // [End of file]
Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Devi essere connesso per rispondere a questo topic.