如何从ant CSV属性中提取第一个元素

时间:2009-08-29 00:01:30

标签: java list ant properties element

给出CSV ant属性

<property name="module.list" value="mod1,mod2,mod3,mod4,mod5"/>

我怎样才能获得第一个元素(即“mod1”)?我想执行一个命令,它将“mod1”作为参数之一。

此外..我无法将此原始“module.list”属性修改为列表或其他任何内容..虽然我可以从此创建另一个列表,属性等..

任何帮助表示赞赏.. 感谢

6 个答案:

答案 0 :(得分:1)

这是实现您所描述内容的一种方法。

  1. 将CSV写入临时文件
  2. 使用 replaceregexp
  3. 进行解析
  4. 将已清理文件的内容读入新属性
  5. 删除临时文件
  6. <target name="parse" description="Example of how to parse the module.list property to extract the first value in the CSV"> 
        <property name="module.list" value="mod1,mod2,mod3,mod4,mod5"/>
    
        <tempfile description="Generate a unique temporary filename for processing"  
        prefix="module.list" suffix="csv" destdir="${basedir}" property="tmpFile" />
    
        <concat description="Write the value of module.list to the temporary file" 
            destfile="${tmpFile}">${module.list}</concat>
    
        <replaceregexp description="filter the temporary file using the regex expression to find the first occurance of a , and all characters afer and replace with nothing"
            file="${tmpFile}"
            match=",.*"
            replace=""
            byline="true"/>
    
        <loadresource description="read the contents of the scrubbed temporary file into the mod1 property"
            property="mod1">
            <file file="${tmpFile}"/>
        </loadresource>
    
        <delete description="remove the temporary file" 
        file="${tmpFile}" />
    
        <!--Now you have the parsed value in the mod1 property -->
        <echo message="mod1=${mod1}" />
    
    </target>
    

答案 1 :(得分:1)

根据module.list的实际内容,您可以使用pathconvert:

<project>
  <property name="module.list" value="mod1,mod2,mod3,mod4,mod5"/>

  <pathconvert property="module.1">
    <path path="${module.list}"/>
    <chainedmapper>
      <flattenmapper/>
      <mapper type="regexp" from="(.*?),.*" to="\1"/>
    </chainedmapper>
  </pathconvert>

  <echo>${module.1}</echo>
</project>

该任务执行大量字符串操作,因此如果module.list的内容可以包含特殊路径字符,则此方法将不起作用。在那种情况下,我会选择一个更通用的答案。

答案 2 :(得分:1)

Ant-Contrib救援。

您可以使用Ant-Contrib中的propertyregex任务来提取逗号分隔字符串的第一部分,如下所示:

<propertyregex property="module.first"
               input="${module.list}"
               regexp="^([^,]*),"
               select="\1"/>

对于你的第二个问题:Ant属性是故意不变的,所以我通常建议不要依赖于改变属性值的设计。但如果这就是您所需要的,Ant-Contrib的var任务可以让您做到这一点。此外,Ant-Contrib中的一些属性任务(如上面提到的propertyregex)具有可选的override属性,允许它们更改目标属性的值。

答案 3 :(得分:1)

如果您想使用所有变量,您还可以查看Ant-Contrib任务和foreach。

<echo message="The first five letters of the alphabet are:"/>
<for list="a,b,c,d,e" param="letter">
  <sequential>
    <echo>Letter @{letter}</echo>
  </sequential>
</for>

http://ant-contrib.sourceforge.net/tasks/tasks/index.html

为了使用For Task,请不要忘记声明此任务def:

<taskdef resource="net/sf/antcontrib/antlib.xml" />

答案 4 :(得分:0)

使用script task。您可以在Javascript或Beanshell中编写脚本,并使用Ant API设置可以从其他ant任务访问的属性。

答案 5 :(得分:0)

第一个问题

使用新的Ant插件= Flaka,您可以使用=

<project xmlns:fl="antlib:it.haefelinger.flaka">

  <property name="module.list" value="mod1,mod2,mod3,mod4,mod5"/>

  <target name="main">   
    <!-- simple echo -->
    <fl:echo>xtractedvalue => #{split('${module.list}',',')[0]}</fl:echo>
    <!-- create property for further processing.. -->
    <fl:let>
      xtractedvalue := split('${module.list}',',')[0]
    </fl:let>
    <echo>$${xtractedvalue} => ${xtractedvalue}</echo> 
  </target> 

</project>

第二个问题

一般情况下,属性在ant中设置为不可变,但使用Flaka时,您可能会覆盖现有属性,例如=

  <property name="foo" value="bar"/>
  <fl:let>foo ::= 'baz'</fl:let>

将使用新值baz覆盖现有属性foo。