как извлечь 1-й элемент из свойства ant CSV - PullRequest
2 голосов
/ 29 августа 2009

с учетом свойства муравья CSV,

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

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

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

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

Ответы [ 6 ]

1 голос
/ 29 ноября 2011

Вы также можете взглянуть на задачи 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 / задачи / задачи / index.html

Чтобы пользователь For Task, не забудьте объявить эту задачу def:

<taskdef resource="net/sf/antcontrib/antlib.xml" />
1 голос
/ 30 августа 2009

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

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

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

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

1 голос
/ 30 августа 2009

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

1 голос
/ 29 августа 2009

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

  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>

0 голосов
/ 04 сентября 2009

Первый вопрос

С новым дополнением 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>

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

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

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

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

0 голосов
/ 29 августа 2009

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

...