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



你好,我不太确定如何命名这个问题,但我会解释为什么我要这样做。

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

如果我的文件夹scripts/中有3个文件:

update3to5.sql
update2to5.sql
update1to6.sql

我需要的结果是有分配属性'最新。6.

从这里我可以很容易地运行脚本。所以问题是3-fold:

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

2-如何遍历数据结构。

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

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

谢谢你的建议

任务的第一部分-将文件名放入'结构'中最好使用FileSet完成-例如在名为scripts的目录中的SQL脚本:

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

创建可以使用id versions引用的Ant资源集合。集合知道你的SQL脚本文件

使用(如您所建议的)regexp映射器,我们可以将文件集转换为字符串集合,仅保存文件名中的版本部分:

<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.

最新更新