Extraction de mots d'une ligne - comme nom de colonne et ses nombres correspondants comme valeurs dans la colonneJ'ai une colonne intitulée «Fault» - où j'ai des codes d'erreur extraits de divers appareils. L'un des codes d'erreur d'un jour particulier est indiqué ci-dessous.
"onduleur Onduleur 20 sous la limite: 0,96 Kilowatts / onduleur (58,9% de 1,63 Kilowatts) au 30/11/2019 7:30:00 AM (sun az: 123,4 el: 3,7) Durée: 4,00 heures Onduleur Onduleur 23 sous la limite: 0,95 Kilowatts / onduleur (57,9% de 1,63 Kilowatts) au 30/11/2019 7:30:00 (soleil az: 123,4 el: 3,7) Durée: 3,50 heures "
J'ai besoin d'extraire les détails comme suit dans le format ---- Nom de la colonne: Valeur
Onduleur: 20
Sous la limite (kW / onduleur): 0,96
% du maximum: 58,9%
Date 30/11/2019
Heure: 7h30
Az soleil: 123,4
Élévation: 3,7
Durée (heures): 4
S'il y a un deuxième onduleur qui a également un code d'erreur, alors (voir la deuxième ligne dans le code d'erreur ci-dessus)
Onduleur: 23
Sous la limite (kW / onduleur): 0,95
% du maximum: 57,9%
Date 30/11/2019
Heure: 7h30
Az soleil: 123,4
Élévation: 3,7
Durée (heures): 3,50
Parfois, il peut y avoir 5 ou 10 onduleurs (sur 70) qui peuvent donner des codes similaires sur une seule ligne.
Pouvez-vous me dire comment y parvenir. Est-ce uniquement via JSL? ou puis-je utiliser des formules? Quoi qu'il en soit, j'ai besoin d'aide.
Tableau de donnéesScriptingRe: Extraire des mots d'une ligne - comme nom de colonne et ses nombres correspondants comme valeurs dans la colonneVous devriez pouvoir faire beaucoup de progrès à ce sujet en utilisant l'éditeur de formule - jetez un œil à la fonction WORD
Re: Extraire des mots d'une ligne - comme nom de colonne et ses nombres correspondants comme valeurs dans la colonneDave,
Oui, je pourrais si je n'ai que 1 ou 2 onduleurs défectueux, mais si, par exemple, j'ai 23 codes d'erreur sur une seule ligne pour une seule date, je dois créer autant de colonnes individuellement, puis rédiger des formules pour chacun des 23 onduleurs. Pouvez-vous préciser si je comprends votre solution.J'ai également ajouté une autre ligne qui résume l'objectif de l'analyse après extraction.
Re: Extraire des mots d'une ligne - comme nom de colonne et ses nombres correspondants comme valeurs dans la colonneJ'ai dû gérer des données comme celles-ci à plusieurs reprises.L'approche qui, à mon avis, doit être adoptée est de lire toutes les données de votre fichier d'entrée dans un tableau de données JMP, où chaque ligne complète est lue dans une seule colonne.Vous vous retrouverez avec une table de données avec une colonne et le nombre de lignes égal au nombre de lignes dans la table de données d'entrée.
Ensuite, vous créez une nouvelle table avec 3 colonnes, étiquette, valeur et ligne.Ensuite, en utilisant JSL qui scanne le contenu de chaque ligne dans une colonne, on crée une nouvelle ligne dans la nouvelle table, et remplit le Label (c'est-à-dire Inverter, Inférieur à la limite (KW / Inverter) etc.), la Valeur (c'est-à-dire 20 , 0.96, etc.) et la ligne, qui ne serait que le numéro de ligne actuel ..... Row ().Il peut également devoir y avoir une colonne de sortie supplémentaire qui serait basée sur le fait qu'il s'agit du 1er onduleur sur la ligne, ou du 2ème onduleur ..... etc.
Cela peut être fait en utilisant une fonction While () en combinaison avec la fonction Word () en recherchant ":" comme délimiteur.Les mots impairs seraient les étiquettes, les pairs seront les valeurs.
Une fois cette nouvelle table créée, vous pouvez facilement passer à une ligne par onduleur, en utilisant Tables => Split.
Re: Extraire des mots d'une ligne - comme nom de colonne et ses nombres correspondants comme valeurs dans la colonneJim
Merci pour votre suggestion. Je vais essayer. Comme je suis nouveau dans le script, je vais passer par des exemples pour le comprendre.
Re: Extraire des mots d'une ligne - comme nom de colonne et ses nombres correspondants comme valeurs dans la colonneJ'ai eu un peu de temps libre ...... pas grand chose d'autre à voir avec Covid-19 toujours là, alors j'ai écrit un peu de JSL qui devrait vous donner un bon départ avec la lecture de vos données
Names Default To Here( 1 );
dt = Open(
"Path to the data file",
columns( New Column( "c000001", Character, "Nominal" ) ),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 0 ),
Column Names Start( 1 ),
Data Starts( 1 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
// Create the new output data table
dtLong = New Table( "Long Data",
New Column( "Label", character ),
New Column( "Value", character ),
New Column( "Line" ),
New Column( "Instance" )
);
// A function that returns the next word in the line and
// then removes the word from the front of the target line
getWord = Function( {},
theWord = Trim( Word( 1, target, " " ) );
target = Trim( Substr( target, Length( theWord ) + 1 ) );
theWord;
);
// Loop through all rows in the input data table
For( i = 1, i <= N Rows( dt ), i++,
instance = 0;
target = Column( dt, 1 )[i];
While( Word( 1, target, " " ) != "",
dtLong << add rows( 1 );
dtLong:line[N Rows( dtLong )] = i;
theWord = getWord();
Match( theWord,
"inverter",
instance++;
dtLong:Instance[N Rows( dtLong )] = instance;
dtLong:Label[N Rows( dtLong )] = theWord;
theWord = getWord();
theWord = getword();
dtLong:value[N Rows( dtLong )] = theWord;,
"below",
dtLong:Instance[N Rows( dtLong )] = instance;
dtLong:Label[N Rows( dtLong )] = theWord || " limit (KW/Inverter)";
theWord = getWord();
theWord = getWord();
dtLong:value[N Rows( dtLong )] = theWord;
// Get the % of Max
dtLong << Add Rows( 1 );
dtLong:line[N Rows( dtLong )] = i;
dtLong:Instance[N Rows( dtLong )] = instance;
theWord = getWord();
theWord = getWord();
dtLong:Label[N Rows( dtLong )] = "% of Max";
dtLong:value[N Rows( dtLong )] = Substr( theWord, 2 );
// Skip forward to the Date
For( k = 1, k <= 5, k++,
theWord = getWord()
);
// Get the Date
dtLong << add rows( 1 );
theWord = getWord();
dtLong:Instance[N Rows( dtLong )] = instance;
dtLong:line[N Rows( dtLong )] = i;
dtLong:Label[N Rows( dtLong )] = "Date";
dtLong:value[N Rows( dtLong )] = theWord;
// Get the Time
dtLong << add rows( 1 );
theWord = getWord();
dtLong:Instance[N Rows( dtLong )] = instance;
dtLong:line[N Rows( dtLong )] = i;
dtLong:Label[N Rows( dtLong )] = "Time";
dtLong:value[N Rows( dtLong )] = theWord || getWord();
// Get the Sun Az
dtLong << add rows( 1 );
theWord = getWord();
dtLong:Instance[N Rows( dtLong )] = instance;
dtLong:line[N Rows( dtLong )] = i;
dtLong:Label[N Rows( dtLong )] = Substr( theWord, 2 ) || " " || getWord();
dtLong:value[N Rows( dtLong )] = getWord();
// Get the Elevation
dtLong << add rows( 1 );
theWord = getWord();
dtLong:Instance[N Rows( dtLong )] = instance;
dtLong:line[N Rows( dtLong )] = i;
dtLong:Label[N Rows( dtLong )] = "Elevation";
dtLong:value[N Rows( dtLong )] = Word( -1, getWord(), ")" );,
"Duration:",
dtLong:Instance[N Rows( dtLong )] = instance;
dtLong:Label[N Rows( dtLong )] = theWord || " (hrs)";
dtLong:value[N Rows( dtLong )] = getWord();
theWord = getWord();
)
;
);
);Re: Extraire des mots d'une ligne - comme nom de colonne et ses nombres correspondants comme valeurs dans la colonneIncroyable! Cela fonctionne.Merci de votre patience en écrivant ce long code pour accomplir ma demande. J'essaye d'implémenter ceci à d'autres codes d'alerte que j'ai. Merci beaucoup. Cela m'a sauvé des éons.