Ayuda con el análisis XMLTodo,
Esto está relacionado con una pregunta diferente en el foro ( https://community.jmp.com/t5/Discussions/Can-JMP-Support-Excel-Formatting-through-JSL/mp/86355#M38495 ). Estoy proporcionando un pequeño subconjunto de un archivo XML realmente grande (XML de una hoja de trabajo en Excel). Me gustaría ver un buen ejemplo sobre cómo recorrer el árbol XML para llegar a un elemento específico de manera eficiente. ¿Alguien puede dar un buen ejemplo sobre cuál es la mejor manera de utilizar Parse XML o una función diferente en JSL para controlar el valor aquí? y editar el valor?
<C r="A1" s="67" t="s">
<V>0</V>
</C>
<WORKSHEET xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" mc="http://schemas.openxmlformats.org/markup-compatibility/2006" ignorable="x14ac" x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
<DIMENSION ref="A1:BB101473"></DIMENSION>
<SHEETVIEWS>
<SHEETVIEW showgridlines="0" tabselected="1" zoomscalenormal="100" workbookviewid="0">
<SELECTION activecell="A13" sqref="A13"></SELECTION>
</SHEETVIEW>
</SHEETVIEWS>
<SHEETFORMATPR defaultrowheight="15" dydescent="0.25"></SHEETFORMATPR>
<COLS>
</COLS>
<SHEETDATA>
<ROW r="1" ht="24">
<C r="A1" s="67" t="s">
<V>0</V>
</C>
<C r="B1" s="67"></C>
<C r="C1" s="67"></C>
<C r="D1" s="67"></C>
<C r="E1" s="67"></C>
<C r="F1" s="67"></C>
<C r="G1" s="67"></C>
<C r="H1" s="67"></C>
<C r="I1" s="67"></C>
<C r="J1" s="67"></C>
<C r="K1" s="67"></C>
<C r="L1" s="67"></C>
<C r="M1" s="67"></C>
<C r="N1" s="10"></C>
<C r="O1" s="4"></C>
<C r="P1" s="4"></C>
<C r="Q1" s="4"></C>
<C r="R1" s="27"></C>
<C r="S1" s="27"></C>
<C r="T1" s="27"></C>
</ROW>
</SHEETDATA>
</WORKSHEET>Intenté lo siguiente y obtuve una mesa vacía:
Parse XML(xml,
On Element("sheetData",Start Tag(New Table())),
On Element( "col", End Tag( New Column( XML Attr( "row r = '1' ht ='24'" ), Set Values( Parse( XML Text() ) ) ) ) )
);Re: Ayuda con el análisis XML@gzmorgan0 ,
Gracias por una respuesta detallada.
Objetivo : Tome un libro de Excel grande con mucho formato y edite los valores en la hoja sin cambiar el formato.
Opciones que he encontrado hasta ahora:
- Utilice un paquete R (como XLConnect (demasiado lento) u openxlsx (estropea el formato y es lento))
- Usar JSL
- Usando JSL, la única opción viable que he encontrado hasta ahora para preservar el formato se basa en la sugerencia de Ian, es decir, aprovechar el XML detrás del libro de Excel, que es lo que estoy tratando de hacer.
- Puede haber una manera de utilizar la consulta XPath de esta manera:
XPath Query("\[<C r="J6" s="48"><V>1</V></C>]\","//v/text()");Devuelve el valor correcto en la celda, sin embargo, la pregunta es cómo reemplazar este valor sin realizar un Reemplazo global.
- Utilice el script VB con Ejecutar programa como sugirió.
Dado que el XML detrás de la hoja1 es tan grande (100.000 líneas o más), tomé un pequeño fragmento para proporcionar un ejemplo y buscar la ayuda de la comunidad sobre cómo puedo profundizar en la jerarquía de manera eficiente. Esperaba mantener toda la solución dentro de JSL y hacerla limpia y eficiente, pero parece que tengo que depender de otros programas si no hay otras opciones para modificar el XML. ¿Crees que hay otras opciones que me faltan? ¿Existe una mejor manera de manejar este problema?
Re: Ayuda con el análisis XMLps para el fragmento de XML que tenía en su publicación, solo la celda A1 tenía un valor. Era de tipo cadena y tendrías que obtener su valor del archivo. "xl/cadenascompartidas.xml"
Re: Ayuda con el análisis XML@uday_guntupalli Según tu publicación anterior y esta cadena de correo electrónico, todavía no estoy seguro de lo que estás intentando hacer. Excel es dueño de su formato.Hice una lectura simple de un archivo relacionado xml, escribí en el archivo y guardé el archivo comprimido y cuando lo abrí en Excel decía que estaba dañado, pero cuando seleccioné la opción para arreglarlo, el libro de Excel contenía mis valores modificados.(¿Quizás escribí en una celda de fórmula?).
¿Está intentando utilizar un archivo Excel grande como base de datos para leer y escribir? ¿Estás intentando cambiar el formato?¿Cuál es la tarea específica, incluido el alcance (tamaño, tarea, actualización en el lugar, agregar filas, eliminar filas, etc.)?
A continuación se muestra un fragmento de un archivo XML en un archivo XLSX de 3 hojas creado a partir de Big Class.jmp, Iris.jmp y Semiconductor Capability.jmp. Esta es la primera hoja.El elemento a tener en cuenta en la dimensión es A1:E41 ya que la primera fila son los nombres de las columnas. Una vez que encuentre los datos de la hoja de etiquetas, los datos se organizan por fila y celda, no es fácil reemplazar una columna.También tenga en cuenta que las celdas con cadenas tienen codificación adicional t =\!"s\!" lo que denota que es una cadena y el valor es un número.Si necesita ese valor de cadena, debe buscar ese valor de cadena en el archivo "xl/sharedStrings.xml". La numeración de referencia comienza con 0.Para este sencillo archivo de Excel de 3 hojas hay 490 cadenas únicas, la cadena 44 es "F" y 45 es "M" para el género.
Si está interesado en leer y escribir XML, hay una sección en JSL Companion 2nd Edition y varios scripts y ejemplos. Pero por lo que "creo" que estás intentando hacer, no lo haría con XML.
"xl/worksheets/sheet1.xml"
"
<WORKSHEET xmlns="\!"http://schemas.openxmlformats.org/spreadsheetml/2006/main\!"" r="\!"http://schemas.openxmlformats.org/officeDocument/2006/relationships\!"" mc="\!"http://schemas.openxmlformats.org/markup-compatibility/2006\!"" ignorable="\!"x14ac" xr="" xr2="" xr3="">
<DIMENSION ref="\!"A1:E41\!"/">
<SHEETVIEWS><SHEETVIEW tabselected="\!"1\!"" workbookviewid="\!"0\!"/"></SHEETVIEW>
<SHEETFORMATPR defaultrowheight="\!"14.4\!"" dydescent="\!"0.3\!"/">
<COLS>
</COLS>
<SHEETDATA>
<ROW r="\!"1\!"" spans="\!"1:5\!"" ht="\!"18.600000000000001\!"" dydescent="\!"0.45\!"">
<C r="\!"A1\!"" s="\!"1\!"" t="\!"s\!""><V>0</V></C>
<C r="\!"B1\!"" s="\!"1\!"" t="\!"s\!""><V>1</V></C>
<C r="\!"C1\!"" s="\!"1\!"" t="\!"s\!""><V>2</V></C>
<C r="\!"D1\!"" s="\!"1\!"" t="\!"s\!""><V>3</V></C>
<C r="\!"E1\!"" s="\!"1\!"" t="\!"s\!""><V>4</V></C>
</ROW>
<ROW r="\!"2\!"" spans="\!"1:5\!"" dydescent="\!"0.3\!"">
<C r="\!"A2\!"" t="\!"s\!""><V>5</V></C>
<C r="\!"B2\!""><V>12</V></C>
<C r="\!"C2\!"" t="\!"s\!""><V>44</V></C>
<C r="\!"D2\!""><V>59</V></C>
<C r="\!"E2\!""><V>95</V></C>
</ROW></SHEETDATA></SHEETFORMATPR></SHEETVIEWS></DIMENSION></WORKSHEET>
Re: Ayuda con el análisis XML
@uday_guntupalli escribió:
@Craige_Hales ,
Esto es realmente útil. ¿Podemos intentar aprovechar la estructura XML inherente que tiene una estructura bien definida?
La razón por la que hago esta pregunta es que, si bien el enfoque de Pat Regex es rápido y eficiente, me preocupa que pueda requerir cambios constantes en el script para mantenerse al día con cambios incluso mínimos en el Excel de origen. ¿Si bien apuntar a atributos en lugar de cadenas podría ser más sólido?
Actualizar : A medida que empiezo a construir mi solución, cuantas más operaciones Pat Regex uso, más lenta se vuelve la solución. No parece escalable. Tengo al menos 20 campos que necesito reemplazar más una serie temporal de 8760 valores en 5 columnas que necesito reemplazar. Actualmente, con más de 8 operaciones de expresiones regulares, JMP tarda un promedio de 3,25 segundos por cada una. ¿Puede recomendarnos alguna otra alternativa escalable? Además, no obtengo 1 al final de Pat Regex.
x = char(10);
Pat Match(
xml, // source
Pat Regex( "\[<C>\s*<V>]\" ) >> prefix + // what comes before goes in prefix
Pat Regex( "[^<]*" ) >> old + // the middle part we care about, probably some digits
Pat Regex( "\[</V>\s*</C>]\" ) >> suffix, // what comes after goes in suffix
prefix || x|| suffix // replace the matched section with this
);
Re: Ayuda con el análisis XML@Craige_Hales ,
Esto es realmente útil. ¿Podemos intentar aprovechar la estructura XML inherente que tiene una estructura bien definida?
La razón por la que hago esta pregunta es que, si bien el enfoque de Pat Regex es rápido y eficiente, me preocupa que pueda requerir cambios constantes en el script para mantenerse al día con cambios incluso mínimos en el Excel de origen. ¿Si bien apuntar a atributos en lugar de cadenas podría ser más sólido?
Re: Ayuda con el análisis XMLSi nada más actualiza el XML, puedes mantenerlo realmente simple con un poco de coincidencia de patrones:
Pat Match(
xml, // source
Pat Regex( "\[<C>\s*<V>]\" ) >> prefix + // what comes before goes in prefix
Pat Regex( "[^<]*" ) >> old + // the middle part we care about, probably some digits
Pat Regex( "\[</V>\s*</C>]\" ) >> suffix, // what comes after goes in suffix
prefix || "42" || suffix // replace the matched section with this
);
show(old);
que reemplazará el 0 con 42. Muestra el valor anterior (0). ejecútelo nuevamente y mostrará 42.
Utilicé \s+ y \s* en lugar de un conjunto codificado de caracteres de espacio en blanco. El sufijo/prefijo se captura del documento, incluidos los caracteres de espacio en blanco reales del documento, por lo que el único cambio debe ser 0 -> 42. El bit del medio, [^<]*, captura una serie de cero o más caracteres que no son < (el comienzo de la siguiente etiqueta).
Asegúrese de probar el código de retorno de patmatch(). Si no es 1, el XML ya no es lo que espera el patrón.