2011-09-08 157 views
4

您好,我不太清楚如何标题这个问题,但我会解释为什么我试图去做。ANT:加载文件名并从文件名中提取数据

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

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

update3to5.sql 
update2to5.sql 
update1to6.sql 

结果我需要的是有一个分配属性“latest.version '的值为6.

从这一点我可以很容易地运行脚本。所以我的问题是3倍:

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

2-如何迭代数据结构。

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

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

感谢您的任何建议。

+0

您可以重命名文件,使相应的电话号码在前面F.E. updateTo6from1.sql你可以简单地按文件名进行排序并完成这个问题? – Yashima

+0

好吧,所有这些都必须从ANT自动完成,所以我不确定一旦文件名被加载到结构中,如果我可以保证最新的将是第一个元素。 – Endo

+0

自从我使用Ant以来已经有一段时间了。您始终可以在java中将其作为AntTask实现并使用您自己的任务。通常您可能会使用FileSet来加载文件,但排序文件集似乎并不重要。 – Yashima

回答

5

任务的第一部分 - 获取文件名成“结构”是最好的使用做了FileSet - 在一个名为脚本目录执行的话SQL脚本:

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

这就产生了一个Ant resource collection可以使用编号versions来引用。 集合知道你的SQL脚本文件。

使用(你的建议)一个正则表达式映射器,我们可以将一组文件转换成字符串的集合,从文件名只持有版本部分:

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

在这个例子中versions现在持有'list',这将是您的示例文件的"5,5,6"

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

这里是一个Javascript“最大的取景器:

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

最有帮助。我很欣赏这些解释。我正要尝试一个自定义的java ant任务,但是这个工作很好。 – Endo