ANT:加载文件名并从文件名中提取数据

时间:2011-09-08 16:26:55

标签: ant filenames

您好我不太确定如何标题这个问题,但我会解释为什么我要这么做。

首先,我有一个包含特定格式的SQL脚本的文件夹,它是updateXtoY.sql,其中X和Y是整数。我需要知道哪个Y是最高的数字。 (基本上,要知道哪个是最新的脚本)

所以如果我的文件夹中有“scripts /”3个文件:

update3to5.sql
update2to5.sql
update1to6.sql

我需要的结果是为属性'latest.version'赋值6。

从那时起,我可以轻松运行脚本。所以我遇到的问题是3倍:

1-如何将文件名加载到数据结构中。

2-如何迭代数据结构。

3-如何评估每个文件名,以便我可以提取文件的“Y”部分并获得最高值。 (我正在读正则表达式)

我是ANT的新手,我不确定这是否可行和/或可行。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:5)

任务的第一部分 - 将文件名转换为'结构'最好使用FileSet - 比如说 scripts 目录中的SQL脚本:

<fileset dir="scripts" includes="*.sql" id="versions" />

这会创建一个可以使用ID versions引用的Ant resource collection。 该集合了解您的SQL脚本文件。

使用(如你所建议的)正则表达式映射器,我们可以将文件集转换为字符串集合,只保存文件名中的版本部分:

<mappedresources id="versions">
    <fileset dir="scripts" includes="*.sql" />
    <regexpmapper from="update.*to(.*).sql" to="\1" />
</mappedresources>

在此示例中,versions现在拥有一个“列表”,您的示例文件为"5,5,6"

现在变得更加棘手,因为你可能需要对什么是字符串列表进行数字排序 - 以避免10次排序为“少于”9.Ant带有嵌入式Javascript解释器,所以你可以使用它找到最大值。另一种选择是利用ant-contrib必须提供的数字排序功能。

这是一个Javascript'max finder':

<scriptdef name="numeric_max" language="javascript">
    <attribute name="property" />
    <attribute name="resources_id" />
    <![CDATA[
    var iter = project.getReference(
       attributes.get( "resources_id" )
   ).iterator( );

    var max_n = 0.0;
    while ( iter.hasNext() )
    {
        var n = parseFloat( iter.next() );
        if ( n > max_n ) max_n = n;
    }
    project.setProperty( attributes.get( "property" ), max_n );
    ]]>
</scriptdef>

它定义了一个新的Ant XML实体 - numeric_max - 看起来像一个任务,可以用来查找字符串集合的数字最大值。 它并不完美 - 没有对字符串的验证,我使用了浮点数而不是整数。

将其与上面的mappedresources相结合:

<mappedresources id="versions">
    <fileset dir="scripts" includes="*.sql" />
    <regexpmapper from="update.*to(.*).sql" to="\1" />
</mappedresources>
<numeric_max property="latest.version" resources_id="versions" />

<echo message="Latest SQL script version: ${latest.version}." />

当我用你的三个文件运行时,我得到了:

[echo] Latest SQL script version: 6.