0 votos

Applescript para buscar un valor específico en un archivo de texto y luego copiar ese valor en una cadena

EDITAR #2

@CJK y @mockman

así que usando vuestras ideas he creado este larguísimo script que hace el truco para el primer valor de offset en el xml y el primer valor de marcador mostrado en el xml

Ahora el objetivo sería ver cómo ejecutar o hacer un bucle con estos manejadores para obtener el valor de inicio de cada Marcador y reemplazarlo con el valor de desplazamiento de cada asset-clip.

Por ejemplo:

<spine>
                        <asset-clip ref="r2" offset="0s" name="against-gravity_by_evgeny-bardyuzha_Artlist" start="86400s" duration="3866100/352800s" audioRole="dialogue">
                            <asset-clip ref="r3" lane="1" offset="6489053/3200s" name="Pexels Videos 1730395" duration="2s" format="r4" tcFormat="NDF" audioRole="dialogue">
                                <conform-rate srcFrameRate="25"/>
                            </asset-clip>
                            <asset-clip ref="r5" lane="1" offset="1036856/12s" name="production ID_4882341" start="554/25s" duration="661500/352800s" format="r6" tcFormat="NDF">
                                <conform-rate srcFrameRate="25"/>
                            </asset-clip>
                            <marker start="276489053/3200s" duration="1/48000s" value="Marker 1"/>
                            <marker start="6912372957/80000s" duration="1/48000s" value="Marker 2"/>
                            <marker start="31106358853/360000s" duration="1/48000s" value="Marker 3"/>
                            <marker start="10369005107/120000s" duration="1/48000s" value="Marker 4"/>
                            <marker start="1244307173/14400s" duration="1/48000s" value="Marker 5"/>
                        </asset-clip>
                    </spine>

DESPUÉS DE EJECUTAR script los Resultados deseados a continuación>>> Observe que los valores de desplazamiento coinciden con los valores de los marcadores

<spine>
                        <asset-clip ref="r2" offset="276489053/3200s" name="against-gravity_by_evgeny-bardyuzha_Artlist" start="86400s" duration="3866100/352800s" audioRole="dialogue">
                            <asset-clip ref="r3" lane="1" offset="6912372957/80000s" name="Pexels Videos 1730395" duration="2s" format="r4" tcFormat="NDF" audioRole="dialogue">
                                <conform-rate srcFrameRate="25"/>
                            </asset-clip>
                            <asset-clip ref="r5" lane="1" offset="31106358853/360000s" name="production ID_4882341" start="554/25s" duration="661500/352800s" format="r6" tcFormat="NDF">
                                <conform-rate srcFrameRate="25"/>
                            </asset-clip>
                            <marker start="276489053/3200s" duration="1/48000s" value="Marker 1"/>
                            <marker start="6912372957/80000s" duration="1/48000s" value="Marker 2"/>
                            <marker start="31106358853/360000s" duration="1/48000s" value="Marker 3"/>

{Hoping the Script ignores this line because no other </asset-clip> exists to change}
<marker start="10369005107/120000s" duration="1/48000s" value="Marker 4"/ > 
{Hoping the Script ignores this line because no other </asset-clip> exists to change}                            
<marker start="1244307173/14400s" duration="1/48000s" value="Marker 5"/>
                        </asset-clip>
                    </spine>

Aquí está todo el fcpxml en su formato completo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fcpxml>

<fcpxml version="1.9">
    <resources>
        <format id="r1" name="FFVideoFormat1080p24" frameDuration="100/2400s" width="1920" height="1080" colorSpace="1-1-1 (Rec. 709)"/>
        <asset id="r2" name="against-gravity_by_evgeny-bardyuzha_Artlist" uid="B1689FB76C9E4A9AF0298680A873E1D2" start="86400s" duration="6297088/44100s" hasAudio="1" audioSources="1" audioChannels="2" audioRate="44100">
            <media-rep kind="original-media" sig="B1689FB76C9E4A9AF0298680A873E1D2" src="file:///Users/davesmacpro/Music/Music%20for%20Projects/against-gravity_by_evgeny-bardyuzha_Artlist.wav">
                <bookmark>Ym9vaxQDAAAAAAQQMAAAAHi61zvH+Xt9eDtxi789DbINi+KCtO1mu9FKykYF+ptlEAIAAAQAAAADAwAAABgAKAUAAAABAQAAVXNlcnMAAAALAAAAAQEAAGRhdmVzbWFjcHJvAAUAAAABAQAATXVzaWMAAAASAAAAAQEAAE11c2ljIGZvciBQcm9qZWN0cwAALwAAAAEBAABhZ2FpbnN0LWdyYXZpdHlfYnlfZXZnZW55LWJhcmR5dXpoYV9BcnRsaXN0LndhdgAUAAAAAQYAABAAAAAgAAAANAAAAEQAAABgAAAACAAAAAQDAABPUwAAAAAAAAgAAAAEAwAAT0AHAAAAAAAIAAAABAMAAEm4BwAAAAAACAAAAAQDAAAPyQcAAAAAAAgAAAAEAwAAN8kHAAAAAAAUAAAAAQYAALQAAADEAAAA1AAAAOQAAAD0AAAACAAAAAAEAABBwaczlkwtyRgAAAABAgAAAQAAAAAAAAAPAAAAAAAAAAAAAAAAAAAACAAAAAQDAAADAAAAAAAAAAQAAAADAwAA9QEAAAgAAAABCQAAZmlsZTovLy8MAAAAAQEAAE1hY2ludG9zaCBIRAgAAAAEAwAAABDQ2e0BAAAIAAAAAAQAAEHEhebagAAAJAAAAAEBAAAxQTAwQjhEMi0zNjIwLTQxQTEtODA0OC02NzBCQUI1ODRFM0MYAAAAAQIAAIEAAAABAAAA7xMAAAEAAAAAAAAAAAAAAAEAAAABAQAALwAAAAAAAAABBQAAzAAAAP7///8BAAAAAAAAABAAAAAEEAAAmAAAAAAAAAAFEAAABAEAAAAAAAAQEAAAMAEAAAAAAABAEAAAIAEAAAAAAAACIAAA/AEAAAAAAAAFIAAAbAEAAAAAAAAQIAAAfAEAAAAAAAARIAAAsAEAAAAAAAASIAAAkAEAAAAAAAATIAAAoAEAAAAAAAAgIAAA3AEAAAAAAAAwIAAACAIAAAAAAAABwAAAUAEAAAAAAAARwAAAIAAAAAAAAAASwAAAYAEAAAAAAAAQ0AAABAAAAAAAAAA=</bookmark>
            </media-rep>
            <metadata>
                <md key="com.apple.proapps.mio.ingestDate" value="2022-12-12 02:32:50 -1000"/>
            </metadata>
        </asset>
        <asset id="r3" name="Pexels Videos 1730395" uid="9E54D5C8D17577E244F9F7835F3A278F" start="0s" duration="36144/600s" hasVideo="1" format="r4" hasAudio="1" videoSources="1" audioSources="1" audioChannels="2" audioRate="48000">
            <media-rep kind="original-media" sig="9E54D5C8D17577E244F9F7835F3A278F" src="file:///Users/davesmacpro/Movies/Pexels%20Videos%201730395.mp4">
                <bookmark>Ym9va8wCAAAAAAQQMAAAAHLUxWFmj8UGU72GTMAnlCWB/KtAonN8I+RDCiLsmrssyAEAAAQAAAADAwAAABgAKAUAAAABAQAAVXNlcnMAAAALAAAAAQEAAGRhdmVzbWFjcHJvAAYAAAABAQAATW92aWVzAAAZAAAAAQEAAFBleGVscyBWaWRlb3MgMTczMDM5NS5tcDQAAAAQAAAAAQYAABAAAAAgAAAANAAAAEQAAAAIAAAABAMAAE9TAAAAAAAACAAAAAQDAABPQAcAAAAAAAgAAAAEAwAAxRp+AAAAAAAIAAAABAMAADzrPQAAAAAAEAAAAAEGAACAAAAAkAAAAKAAAACwAAAACAAAAAAEAABBwpXm0YAAABgAAAABAgAAAQAAAAAAAAAPAAAAAAAAAAAAAAAAAAAACAAAAAQDAAACAAAAAAAAAAQAAAADAwAA9QEAAAgAAAABCQAAZmlsZTovLy8MAAAAAQEAAE1hY2ludG9zaCBIRAgAAAAEAwAAABDQ2e0BAAAIAAAAAAQAAEHEhebagAAAJAAAAAEBAAAxQTAwQjhEMi0zNjIwLTQxQTEtODA0OC02NzBCQUI1ODRFM0MYAAAAAQIAAIEAAAABAAAA7xMAAAEAAAAAAAAAAAAAAAEAAAABAQAALwAAAAAAAAABBQAAzAAAAP7///8BAAAAAAAAABAAAAAEEAAAaAAAAAAAAAAFEAAAwAAAAAAAAAAQEAAA6AAAAAAAAABAEAAA2AAAAAAAAAACIAAAtAEAAAAAAAAFIAAAJAEAAAAAAAAQIAAANAEAAAAAAAARIAAAaAEAAAAAAAASIAAASAEAAAAAAAATIAAAWAEAAAAAAAAgIAAAlAEAAAAAAAAwIAAAwAEAAAAAAAABwAAACAEAAAAAAAARwAAAIAAAAAAAAAASwAAAGAEAAAAAAAAQ0AAABAAAAAAAAAA=</bookmark>
            </media-rep>
            <metadata>
                <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/>
                <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/>
                <md key="com.apple.proapps.studio.cameraISO" value="0"/>
                <md key="com.apple.proapps.studio.cameraColorTemperature" value="0"/>
                <md key="com.apple.proapps.spotlight.kMDItemCodecs">
                    <array>
                        <string>AVC Coding</string>
                        <string>MPEG-4 AAC</string>
                    </array>
                </md>
                <md key="com.apple.proapps.mio.ingestDate" value="2022-12-09 10:31:28 -1000"/>
            </metadata>
        </asset>
        <format id="r4" name="FFVideoFormat3840x2160p25" frameDuration="100/2500s" width="3840" height="2160" colorSpace="1-1-1 (Rec. 709)"/>
        <asset id="r5" name="production ID_4882341" uid="6F199E9ADD1C3E1C25A01431E12EF3E3" start="0s" duration="1943/25s" hasVideo="1" format="r6" videoSources="1">
            <media-rep kind="original-media" sig="6F199E9ADD1C3E1C25A01431E12EF3E3" src="file:///Users/davesmacpro/Movies/production%20ID_4882341.mp4">
                <bookmark>Ym9va8wCAAAAAAQQMAAAAELPIBuUH6inb74/CLc27nr2yrwiIVd8Ni9hDXz1lgueyAEAAAQAAAADAwAAABgAKAUAAAABAQAAVXNlcnMAAAALAAAAAQEAAGRhdmVzbWFjcHJvAAYAAAABAQAATW92aWVzAAAZAAAAAQEAAHByb2R1Y3Rpb24gSURfNDg4MjM0MS5tcDQAAAAQAAAAAQYAABAAAAAgAAAANAAAAEQAAAAIAAAABAMAAE9TAAAAAAAACAAAAAQDAABPQAcAAAAAAAgAAAAEAwAAxRp+AAAAAAAIAAAABAMAAFvrPQAAAAAAEAAAAAEGAACAAAAAkAAAAKAAAACwAAAACAAAAAAEAABBwpXn7AAAABgAAAABAgAAAQAAAAAAAAAPAAAAAAAAAAAAAAAAAAAACAAAAAQDAAACAAAAAAAAAAQAAAADAwAA9QEAAAgAAAABCQAAZmlsZTovLy8MAAAAAQEAAE1hY2ludG9zaCBIRAgAAAAEAwAAABDQ2e0BAAAIAAAAAAQAAEHEhebagAAAJAAAAAEBAAAxQTAwQjhEMi0zNjIwLTQxQTEtODA0OC02NzBCQUI1ODRFM0MYAAAAAQIAAIEAAAABAAAA7xMAAAEAAAAAAAAAAAAAAAEAAAABAQAALwAAAAAAAAABBQAAzAAAAP7///8BAAAAAAAAABAAAAAEEAAAaAAAAAAAAAAFEAAAwAAAAAAAAAAQEAAA6AAAAAAAAABAEAAA2AAAAAAAAAACIAAAtAEAAAAAAAAFIAAAJAEAAAAAAAAQIAAANAEAAAAAAAARIAAAaAEAAAAAAAASIAAASAEAAAAAAAATIAAAWAEAAAAAAAAgIAAAlAEAAAAAAAAwIAAAwAEAAAAAAAABwAAACAEAAAAAAAARwAAAIAAAAAAAAAASwAAAGAEAAAAAAAAQ0AAABAAAAAAAAAA=</bookmark>
            </media-rep>
            <metadata>
                <md key="com.apple.proapps.studio.rawToLogConversion" value="0"/>
                <md key="com.apple.proapps.spotlight.kMDItemProfileName" value="HD (1-1-1)"/>
                <md key="com.apple.proapps.studio.cameraISO" value="0"/>
                <md key="com.apple.proapps.studio.cameraColorTemperature" value="0"/>
                <md key="com.apple.proapps.spotlight.kMDItemCodecs">
                    <array>
                        <string>AVC Coding</string>
                    </array>
                </md>
                <md key="com.apple.proapps.mio.ingestDate" value="2022-12-09 10:31:28 -1000"/>
            </metadata>
        </asset>
        <format id="r6" name="FFVideoFormat4096x2160p25" frameDuration="100/2500s" width="4096" height="2160" colorSpace="1-1-1 (Rec. 709)"/>
    </resources>
    <library location="file:///Users/davesmacpro/Desktop/XML%20tests/Test%20project%20for%20xml.fcpbundle/">
        <event name="12-9-22" uid="A11C4F20-CFCC-4D32-9B9C-AABF1829B666">
            <project name="24 p test rewrite file" uid="717DAFEC-AB91-403C-A451-9E4CC8EC35E8" modDate="2022-12-16 18:04:54 -1000">
                <sequence format="r1" duration="26300/2400s" tcStart="0s" tcFormat="NDF" audioLayout="stereo" audioRate="48k">
                    <spine>
                        <asset-clip ref="r2" offset="0s" name="against-gravity_by_evgeny-bardyuzha_Artlist" start="86400s" duration="3866100/352800s" audioRole="dialogue">
                            <asset-clip ref="r3" lane="1" offset="3800/3200s" name="Pexels Videos 1730395" duration="2s" format="r4" tcFormat="NDF" audioRole="dialogue">
                                <conform-rate srcFrameRate="25"/>
                            </asset-clip>
                            <asset-clip ref="r5" lane="1" offset="1036856/12s" name="production ID_4882341" start="554/25s" duration="661500/352800s" format="r6" tcFormat="NDF">
                                <conform-rate srcFrameRate="25"/>
                            </asset-clip>
                            <marker start="276489053/3200s" duration="1/48000s" value="Marker 1"/>
                            <marker start="6912372957/80000s" duration="1/48000s" value="Marker 2"/>
                            <marker start="31106358853/360000s" duration="1/48000s" value="Marker 3"/>
                            <marker start="10369005107/120000s" duration="1/48000s" value="Marker 4"/>
                            <marker start="1244307173/14400s" duration="1/48000s" value="Marker 5"/>
                        </asset-clip>
                    </spine>
                </sequence>
            </project>
        </event>
        <smart-collection name="Projects" match="all">
            <match-clip rule="is" type="project"/>
        </smart-collection>
        <smart-collection name="All Video" match="any">
            <match-media rule="is" type="videoOnly"/>
            <match-media rule="is" type="videoWithAudio"/>
        </smart-collection>
        <smart-collection name="Audio Only" match="all">
            <match-media rule="is" type="audioOnly"/>
        </smart-collection>
        <smart-collection name="Stills" match="all">
            <match-media rule="is" type="stills"/>
        </smart-collection>
        <smart-collection name="Favorites" match="all">
            <match-ratings value="favorites"/>
        </smart-collection>
    </library>
</fcpxml>

Sólo hay que centrarse en los cambios:

columna vertebral "sección de datos a manipular" columna vertebral zona

0voto

qarma Puntos 71

Si tiene un archivo XML, suele ser aconsejable analizarlo como XML en lugar de como texto sin formato. Eventos del sistema ofrece un conjunto de comandos que pueden descender por una jerarquía de objetos XML y extraer los atributos asociados a cada elemento.

El fragmento de XML que ha proporcionado no es realmente un XML válido, ya que contiene un elemento superfluo </asset-clip> elemento. Así pues, para demostrar el análisis sintáctico de su fragmento XML, he eliminado el primero de los dos elementos de cierre </asset-clip> tags:

tell application id "com.apple.SystemEvents"
        set xml to make new XML data with data "<spine>
        <asset-clip ref=\"r3\" lane=\"1\" offset=\"86400s\" 
                    name=\"Pexels Videos 1730395\" 
                    duration=\"646800/352800s\" 
                    format=\"r4\" tcFormat=\"NDF\" 
                    audioRole=\"dialogue\">
                <conform-rate srcFrameRate=\"25\"/>
                <marker start=\"6912372957/80000s\" 
                        duration=\"1/48000s\" 
                        value=\"Marker 2\"/>
        </asset-clip>
</spine>"

        tell xml's XML element "spine" to tell ¬
                XML element "asset-clip" to tell ¬
                XML element "marker" to get the ¬
                value of XML attribute "start"
end tell

Esto devuelve el valor esperado "6912372957/80000s" .

Dado que vas a leer el XML desde un archivo XML en lugar de una cadena como hice anteriormente, empezarías reemplazando la línea de código en el script anterior que empieza:

set xml to ...

(incluida la cadena XML que se divide en varias líneas) con:

set xml to XML element 1 of XML file "/path/to/file.xml"

XML element 1 representa el elemento root, que es siempre el punto de partida cuando se recorre una jerarquía XML. En la cadena XML que asigné a la variable xml en el código AppleScript anterior, el elemento Root era el denominado XML element "spine" pero si éste es, a su vez, hijo de algún otro elemento XML ascendente en su archivo, entonces no será el elemento root.

Tendrá que construir la cadena de referencia AppleScript que toma Eventos del sistema del analizador XML de XML element 1 (el elemento root, al que se puede hacer referencia por el número de índice 1 en lugar de su nombre) a través del modelo de objetos XML hasta el XML element "spine" a partir de donde mi código lo lleva el resto del camino (a menos que los extraños </asset-clip> no es, de hecho, extraña en el contexto del archivo en su conjunto, lo que deberá reflejarse en el AppleScript XML element cadena.

Mi explicación probablemente hace que suene más difícil de lo que es en la práctica, y si usted utiliza mi código AppleScript como guía, se puede ver que es bastante sencillo, y también resulta en menos líneas de código-que también va a hacer un trabajo más fiable-en comparación con cualquier intento de analizar el archivo XML como texto.


De la misma manera leemos el start del atributo <marker> también podemos asignar un nuevo valor a la etiqueta offset del atributo <asset-clip> etiqueta.

Donde AppleScript fue instruido para:

get the value of XML attribute "start"

asignarías este valor a una variable, entonces:

set the value of XML attribute "offset" to ...

Por supuesto, tendrá que apuntar al XML element "asset-clip" de la misma manera jerárquica que se hizo para XML element "marker" . Pero eso no implica ningún trabajo adicional, y lo que acabas teniendo es un script que literalmente hace lo que hay que hacer: es decir, encuentra el valor de algún atributo específico, y lo utiliza para reemplazar el valor existente de algún otro atributo específico. Son dos operaciones.


Sin embargo, hay una tercera operación final. El XML que contiene el nuevo valor de offset se almacenará en el archivo xml a través de la cual se hace referencia a todo lo demás. Esto tiene que ser escrito a un archivo.

Se puede obtener una representación de texto del XML mediante xml's text .

Para evitar la pérdida de datos, te aconsejo que escribas el texto XML en un archivo aparte y que sustituyas el archivo antiguo una vez que hayas validado el nuevo. De hecho, tu planteamiento original era sensato, es decir, duplicar el archivo XML antes de leyendo de él, que puedes simplemente sobrescribir con los nuevos contenidos sin preocuparte demasiado.

La duplicación debe hacerse a través de Finder:

tell application id "com.apple.finder" to duplicate ¬
        the file ("/path/to/file.xml" as POSIX file) ¬
        to ("/path/to/newfile.xml" as POSIX file)

La escritura se hace así:

tell application id ("com.apple.SystemEvents")
                  .
                  .
        (* all the code to get and replace
           the attributes's values *)
                  .
                  .
        set xmlText to the xml's text
end tell

set the eof of "/path/to/newfile.xml" to 0 --> scrubs the file
write the xmlText as "utf8" to "/path/to/newfile.xml"

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X