2011-03-28 41 views
13

En perl usamos <FileDescriptor> para leer la línea de datos de un archivo desde ilne. Cómo hacer lo mismo usando script ant.¿Cómo leer datos línea por línea desde un archivo usando el script ant?

+0

¿Puede dar más contexto? ¿Que estás tratando de hacer? –

+0

Ver: http://ant.apache.org/manual/Types/filterchain.html#headfilter –

+0

Gracias @martin con la ayuda de filterchain y head filter, puedo leer los datos del archivo. – rashok

Respuesta

27

Puede hacerlo utilizando la tarea loadfile en combinación con la tarea for de (deberá descargar e instalar ant-contrib).

<project name="test" default="compile"> 

    <taskdef resource="net/sf/antcontrib/antcontrib.properties"> 
    <classpath> 
     <pathelement location="path/to/ant-contrib.jar"/> 
    </classpath> 
    </taskdef> 

    <loadfile property="file" srcfile="somefile.txt"/> 

    <target name="compile"> 
    <for param="line" list="${file}" delimiter="${line.separator}"> 
     <sequential> 
     <echo>@{line}</echo> 
     </sequential> 
    </for> 
    </target> 

</project> 
+0

No puedo instalar 'ant-contrib' en mi aplicación. ¿Podría decirme cómo leer solo la primera línea de un archivo, sin usar 'for' – rashok

+0

@rajaashok, puede usar [' headfilter'] (http://ant.apache.org/manual/Types/filterchain.html #headfilter) dentro de 'loadfile' – lesmana

4

sólo tenía que hacer que yo, en realidad la solución de + line.separator es defectuoso porque:

  • sólo funciona si los EOLs archivo coincidan con la plataforma de EOL
  • descarta líneas vacías

Aquí es otra solución (mejor), basado en el ejemplo anterior:

<project name="test" default="compile"> 

    <taskdef resource="net/sf/antcontrib/antcontrib.properties"> 
    <classpath> 
     <pathelement location="path/to/ant-contrib.jar"/> 
    </classpath> 
    </taskdef> 

    <loadfile property="file" srcfile="somefile.txt"/> 

    <target name="compile"> 
    <for param="line"> 
     <tokens> 
     <file file="${file}"/> 
     </tokens> 
     <sequential> 
     <echo>@{line}</echo> 
     </sequential> 
    </for> 
    </target> 

</project> 
2

El ejemplo que utiliza tokens no funcionó para mí. En mi situación, simplemente buscaba imprimir un archivo README sin perder las líneas en blanco. Aquí esta lo que hice.

<taskdef name="if-contrib" classname="net.sf.antcontrib.logic.IfTask" classpath="${basedir}/lib/ant/ant-contrib-1.0b3.jar" /> 
<taskdef name="for-contrib" classname="net.sf.antcontrib.logic.ForTask" classpath="${basedir}/lib/ant/ant-contrib-1.0b3.jar" /> 
<taskdef name="var-contrib" classname="net.sf.antcontrib.property.Variable" classpath="${basedir}/lib/ant/ant-contrib-1.0b3.jar" /> 
<target name="help"> 
    <for-contrib param="line"> 
     <tokens> 
      <file file="README.txt" /> 
     </tokens> 
     <sequential> 
      <var-contrib name="line.length" unset="true" /> 
      <length string="@{line}" property="line.length" /> 
      <if-contrib> 
       <equals arg1="${line.length}" arg2="0" /> 
       <then> 
        <echo> 
        </echo> 
       </then> 
       <else> 
        <echo>@{line}</echo> 
       </else> 
      </if-contrib> 
     </sequential> 
    </for-contrib> 
</target> 
0

Intenta lo que debería ser el trabajo .....

<project name="test" default="compile"> 
<loadfile property="file" srcfile="Help.txt"/> 
    <target name="compile"> 
    <echo>${file}</echo> 
    </target> 
</project> 
Cuestiones relacionadas