2009-08-29 4 views
2

даной CSV муравья свойства,как извлечь 1-ый элемент из муравьиного CSV собственности

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

как я могу просто получить первый элемент (т.е. «Mod1» здесь)? Я хочу выполнить команду, которая будет принимать «mod1» в качестве одного из аргументов.

Кроме того .. Я не могу изменить это оригинальное свойство «module.list» в список или что-нибудь еще .. хотя я могу создать еще один список, имущества и т.д. от этого ..

Любая помощь приветствуется .. Thanks

ответ

0

Используйте script task. Вы можете написать сценарий в Javascript или Beanshell и использовать Ant API для установки свойства, доступ к которому вы можете получить из других задач муравьев.

1

Это один из способов добиться того, что вы описали.

  1. Написать CSV временный файл
  2. разобрать его с replaceregexp
  3. прочитать содержимое промытого файла в новое свойство
  4. Удалите временный файл

<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

В зависимости от фактического содержания 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 может содержат специальные символы пути, этот подход не будет работать. В этом случае я бы пошел с одним из более общих ответов.

+0

хорошее решение. Простой способ реализации регулярных выражений для манипуляции строками. Я должен это вспомнить. –

0

Ant-Contrib на помощь.

Вы можете использовать propertyregex задачу из Ant-Contrib, чтобы извлечь первую часть строки, разделенных запятыми, как это:

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

Для вашего второго вопроса: Ant свойства неизменны с целью , поэтому я, как правило, рекомендую против конструкций, которые полагаются на изменение значений свойств. Но если это то, что вам нужно, задача var от Ant-Contrib позволяет вам сделать именно это. Кроме того, некоторые из заданий свойств в Ant-Contrib, например, propertyregex, упомянутые выше, имеют необязательный атрибут override, который позволяет им изменять значение целевого свойства.

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> 

Второй вопрос

обычно свойства неизменны один раз установить в муравья, но с Flaka вы можете перезаписать существующее свойство, подобное этому:

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

будет перезаписывать существующее свойство foo новым значением baz.

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

Для того, чтобы пользователь для задачи, не забудьте объявить эту задачу Защиту:

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