2011-09-08 158 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