Ayuda con el análisis de 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 cálculo en Excel). Me gustaría ver un buen ejemplo de cómo atravesar el árbol XML para llegar a un elemento de destino de manera eficiente. ¿Alguien puede proporcionar un buen ejemplo sobre cuál es la mejor manera de usar Parse XML o una función diferente en JSL para manejar 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 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:
- Use un paquete R (como XLConnect (demasiado lento) o 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 usar XPath Query así:
XPath Query("\[<C r="J6" s="48"><V>1</V></C>]\","//v/text()");Devuelve el valor correcto en la celda, sin embargo, la pregunta recae en cómo reemplaza este valor sin realizar un Reemplazo global.
- Use el script VB con Ejecutar programa como sugirió.
Dado que el XML detrás de la hoja 1 es tan grande (100 000 líneas o más), tomé un pequeño fragmento para proporcionar un ejemplo para buscar la ayuda de la comunidad sobre cómo puedo desglosar la jerarquía de manera eficiente. Tenía la esperanza de mantener toda la solución dentro de JSL y hacerla limpia y eficiente, pero parece que tengo que confiar en otros programas si no hay otras opciones para modificar el XML. ¿Crees que hay otras opciones que me faltan? ¿Hay una mejor manera de manejar este problema?
Re: Ayuda con 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/cadenas compartidas.xml"
Re: Ayuda con análisis XML@uday_guntupalli de su publicación anterior y esta cadena de correo electrónico, todavía no estoy seguro de lo que está tratando de hacer. Excel es dueño de su formato.Realicé una lectura simple de un archivo relacionado con xml y 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.(¿Tal vez escribí en una celda de fórmula?).
¿Está tratando de utilizar un gran archivo de Excel como base de datos para leer y escribir? ¿Estás tratando de 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 es la dimensión A1:E41 ya que la primera fila son los nombres de las columnas. Una vez que encuentre Tag sheetData, 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\!" 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 simple archivo de Excel de 3 hojas, hay 490 cadenas únicas, la cadena 44 es "F" y la 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á tratando de 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 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: 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 incluso con cambios mínimos en la fuente de Excel. ¿Mientras que apuntar a los atributos en lugar de las cadenas podría ser más sólido?
Actualizar : A medida que empiezo a construir mi solución, cuantas más operaciones de 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, más de 8 operaciones de expresiones regulares, JMP está tomando un promedio de 3.25 segundos por cada una, ¿puede recomendar otras alternativas escalables? 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 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: 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 incluso con cambios mínimos en la fuente de Excel. ¿Mientras que apuntar a los atributos en lugar de las cadenas podría ser más sólido?
Re: Ayuda con análisis XMLsi nada más actualiza el XML, puede 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 antiguo (0). ejecútelo de nuevo y mostrará 42.
Usé \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 secuencia 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.