2012-07-30 18 views
6

Las siguientes líneas están presentes en el archivo. Me gustaría extraer datos múltiples de este archivo.extrayendo el valor de un archivo usando ant

Número de usuario actual a construir listas: 23

  • tiempo de ejecución 'RevisionBuild' (en minutos) = 8,40

[construir] RC = 0

I utilizó la siguiente expresión regular para recuperar el valor 23 de este archivo

<ac:for param="line" list="${logFileContent}" delimiter="${line.separator}"> 
    <sequential>       
<propertyregex property="noOfBuildlists" 
     input="@{line}" 
    regexp="(.*)Number of current user build lists: (.*)$" 
    select="\2"/> 
    </sequential> 
</ac:for> 

Pero la misma expresión regular no tiene ningún valor cuando trato de buscar las otras líneas como regexp = "(. ) [revBuild] RC = (.) $" o regexp = "(. ) Tiempo de Run 'RevisionBuild' (en minutos) = (.) $" donde los valores extraídos deben ser 0 y 8,40, respectivamente.

por favor alguien puede ayudar? Gracias , Aarthi

Respuesta

9

Creo que esto es lo que le interesa. en un archivo de entrada, como a continuación

Number of current user build lists: 23 
'RevisionBuild' Run time (in minutes) = 8.40 
[Build] RC = 0 

cuando ejecuto por debajo del objetivo

<project name="BuildModule" basedir="." default="extract.nums"> 
    <taskdef resource="net/sf/antcontrib/antlib.xml" /> 
    <property environment="env" /> 
    <loadfile property="file" srcfile="${basedir}/inputLog.log"/> 
    <target name="extract.nums"> 
     <for param="line" delimiter="${line.separator}" list="${file}"> 
      <sequential> 
       <propertyregex property="noOfBuildlists" input="@{line}" regexp="Number of current user build lists:\s*([0-9]+)$" select="\1" /> 
       <propertyregex property="revisionBuild" input="@{line}" regexp="'RevisionBuild' Run time\s*\(in minutes\)\s*=\s*([0-9\.]+)$" select="\1" /> 
       <propertyregex property="rcBuild" input="@{line}" regexp="\[Build\] RC\s*\=\s*([0-9]+)$" select="\1" /> 
      </sequential> 
     </for> 
     <echo message="Current user build : ${noOfBuildlists}" /> 
     <echo message="Revision Build : ${revisionBuild}" /> 
     <echo message="RC Build : ${rcBuild}" /> 
    </target> 
</project> 

Me sale debajo de la salida.

[echo] Current user build : 23 
[echo] Revision Build : 8.40 
[echo] RC Build : 0 
+0

Gracias a ton. Esto funciona muy bien ¿Puedes explicar el uso de \ s *? Observé que usas esta expresión regular cada vez que hay un espacio seguido de un carácter especial (como (o) o = – user1384205

+0

'\ s' representa el carácter de espacio en blanco y' \ s * 'significa cero o más ocurrencias para los caracteres de espacio en blanco. hacer una expresión más robusta y unir incluso si hay más espacios o si no hay ninguno. –

+0

Gracias de nuevo Vaman. Para buscar una cadena "¿Necesita compilar esta lista de compilación: verdadera", probé la siguiente expresión regular ¿Esta lista de compilación necesita compilar: \ s * ([rt] +) $ Sin embargo, la expresión regular no funciona. – user1384205

1

Cuando uso propertyregex, se pedirá un error if doesn't support the nested "condition" element. Hay muchos elementos anidados de "condición" en mi {android.sdk.air}/tools/ant/build.xml. Así que traté de encontrar una solución que Ant estándar pueda presentar. Lo hice.

intenta esto:

<loadfile 
    encoding="UTF-8" 
    property="property.for.your.string" 
    srcFile="your/file/path" > 
     <filterchain> 
      <tokenfilter> 
       <containsregex 
        pattern="Number of current user build lists:\s*([0-9]+)$" 
        replace="\1" /> 
      </tokenfilter> 
     </filterchain> 
</loadfile> 

<echo message="DEBUG LOG: property.for.your.string = ${property.for.your.string}" /> 

Esto me hace preguntarme por qué el nombre de hormigas el atributo como "reemplazar", que lleva a mi malentendido.

Cuestiones relacionadas