Home › Forum › Programmazione IEC 61131 (LogicLab) › Utilizzo regular expressions in SysVsscanf
- Questo topic ha 1 risposta, 1 partecipante ed è stato aggiornato l'ultima volta 2 settimane, 1 giorno fa da Sergio Bertana.
-
AutorePost
-
Agosto 27, 2024 alle 2:10 pm #77643AnonimoInattivo
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 “;”).
Agosto 27, 2024 alle 3:07 pm #77648Sergio BertanaAmministratore del forumHo 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.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.