Extraer palabras de una línea, como nombre de columna y sus números correspondientes como valores en la columnaTengo una columna llamada "Fallo" - donde tengo códigos de falla extraídos de varios dispositivos. A continuación se proporciona uno de los códigos de error de un día en particular.
"inversor Inversor 20 por debajo del límite: 0,96 kilovatios / inversor (58,9% de 1,63 kilovatios) al 30/11/2019 7:30:00 a.m. (sol az: 123,4 el: 3,7) Duración: 4,00 horas inversor Inversor 23 por debajo del límite: 0,95 Kilovatios / inversor (57,9% de 1,63 Kilovatios) al 30/11/2019 7:30:00 AM (sol az: 123,4 el: 3,7) Duración: 3,50 horas "
Necesito extraer los detalles de la siguiente manera en el formato ---- Nombre de la columna: Valor
Inversor: 20
Por debajo del límite (kW / inversor): 0,96
% del máximo: 58,9%
Fecha 30/11/2019
Hora: 7:30:00 AM
Sol Az: 123,4
Elevación: 3.7
Duración (hrs): 4
Si hay un segundo inversor que también tiene un código de falla, entonces (vea la segunda línea en el código de falla anterior)
Inversor: 23
Por debajo del límite (kW / inversor): 0,95
% del máximo: 57,9%
Fecha 30/11/2019
Hora: 7:30:00 AM
Sol Az: 123,4
Elevación: 3.7
Duración (hrs): 3.50
A veces puede haber 5 o 10 inversores (de 70) que podrían dar códigos similares en una sola línea.
¿Puedes decirme cómo hacer esto? ¿Es solo a través de JSL? o puedo usar fórmulas? De cualquier manera, necesito ayuda.
Tabla de datosScriptingRe: Extraer palabras de una línea, como nombre de columna y sus números correspondientes como valores en la columnaDebería poder avanzar mucho en esto utilizando el editor de fórmulas; eche un vistazo a la función WORD
Re: Extraer palabras de una línea, como nombre de columna y sus números correspondientes como valores en la columnaDave,
Sí, podría hacerlo si solo tuviera 1 o 2 inversores defectuosos, pero entonces, si, por ejemplo, tengo 23 códigos de falla en una sola línea para una sola fecha, entonces necesito crear tantas columnas individualmente y luego escribir fórmulas para cada una de las 23 inversores. ¿Puede aclarar si entiendo su solución?También agregué otra línea que resume el objetivo del análisis después de la extracción.
Re: Extraer palabras de una línea, como nombre de columna y sus números correspondientes como valores en la columnaHe tenido que manejar datos como este muchas veces.El enfoque que creo que se debe tomar es leer todos los datos de su archivo de entrada en una tabla de datos JMP, donde cada línea completa se lee en una sola columna.Terminará con una tabla de datos con una columna y el número de filas es igual al número de líneas en la tabla de datos de entrada.
A continuación, crea una nueva tabla con 3 columnas, Etiqueta, Valor y Línea.Luego, usando JSL que escanea el contenido de cada fila en una columna, se crea una nueva fila en la nueva tabla y se llena la Etiqueta (es decir, Inversor, Límite inferior (KW / Inversor), etc.), el Valor (es decir, 20 , 0.96, etc.) y la Línea, que sería solo el número de fila actual ..... Fila ().Es posible que también tenga que haber una columna de salida adicional que se basaría en que este sea el primer inversor de la línea, o el segundo inversor ... etc.
Esto se puede hacer usando una función While () en combinación con la función Word () buscando ":" como delimitador.Las palabras impares serían las Etiquetas, las pares serían los Valores.
Una vez que se crea esta nueva tabla, puede moverse fácilmente a una fila por inversor, usando Tablas => Dividir.
Re: Extraer palabras de una línea, como nombre de columna y sus números correspondientes como valores en la columnaJim
Gracias por su sugerencia. Intentaré. Como soy nuevo en las secuencias de comandos, revisaré ejemplos para resolverlo.
Re: Extraer palabras de una línea, como nombre de columna y sus números correspondientes como valores en la columnaTenía algo de tiempo libre ... no había mucho más que hacer con Covid-19 todavía, así que escribí un poco de JSL que debería darte un buen comienzo para leer tus datos
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: Extraer palabras de una línea, como nombre de columna y sus números correspondientes como valores en la columna¡Asombroso! Funciona Gracias por su paciencia al escribir este largo código para cumplir con mi solicitud. Estoy tratando de implementar esto en otros códigos de alerta que tengo. Muchas gracias. Me ahorró eones.