如何从 ant CSV 属性中提取第一个元素

发布于 2024-08-03 20:25:27 字数 265 浏览 5 评论 0原文

给定 CSV ant 属性,

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

我怎样才能获取第一个元素(即此处的“mod1”)?我想执行一个将“mod1”作为参数之一的命令。

此外..我无法将这个原始的“module.list”属性修改为列表或其他任何内容..尽管我可以从中创建另一个列表、属性等..

感谢任何帮助.. 谢谢

given a CSV ant property,

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

how can I just get the first element (ie "mod1" here)? I want to execute a command that will take in "mod1" as one of the arguments.

Moreover.. I cannot modify this original "module.list" property to a list or anything else.. although I can create another list,property,etc from this..

Any help is appreciated..
Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

澜川若宁 2024-08-10 20:25:27

这是实现您所描述的内容的一种方法。

  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>

This is one way to accomplish what you described.

  1. Write the CSV to a temporary file
  2. parse it with replaceregexp
  3. read the contents of the scrubbed file into a new property
  4. Remove the temporary file
<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>

坚持沉默 2024-08-10 20:25:27

根据 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 的内容可以包含特殊路径字符,则此方法将不起作用。在这种情况下,我会选择更通用的答案之一。

Depending on the actual contents of module.list, you might be able to use 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>

That task does a large amount of string manipulation, so if the contents of module.list can contain special path characters, this approach won't work. In that case, I'd go with one of the more generic answers.

辞旧 2024-08-10 20:25:27

Ant-Contrib 来救援。

您可以使用 propertyregex 来自 Ant-Contrib 的任务来提取第一个像这样的逗号分隔字符串的一部分:

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

对于第二个问题:Ant 属性是故意不可变的,因此我通常建议不要依赖于更改属性值的设计。但如果这就是您所需要的,则 var< Ant-Contrib 的 /a> 任务可以让您做到这一点。此外,Ant-Contrib 中的一些属性任务(例如上面提到的 propertyregex)具有可选的 override 属性,允许它们更改目标属性的值。

Ant-Contrib to the rescue.

You can use the propertyregex task from Ant-Contrib to extract the first part of a comma-separated string like this:

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

For your second question: Ant properties are immutable on purpose, so I would generally recommend against designs which rely on changing values of properties. But if that is what you need, the var task from Ant-Contrib allows you to do just that. In addition, some of the property tasks in Ant-Contrib, like propertyregex mentioned above, have an optional override attribute which allow them to change the value of the target property.

凉世弥音 2024-08-10 20:25:27

如果您想使用所有变量,您还可以查看 Ant-Contrib 任务的 for 和 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

为了使用 For Task,不要忘记声明此任务 def :

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

You can also take a look at Ant-Contrib tasks for and foreach, if you want to use all variables.

<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

In order to user For Task, don't forget to declare this task def :

<taskdef resource="net/sf/antcontrib/antlib.xml" />
儭儭莪哋寶赑 2024-08-10 20:25:27

使用脚本任务。您可以使用 Javascript 或 Beanshell 编写脚本,并使用 Ant API 来设置可从其他 ant 任务访问的属性。

Use the script task. You can write a script in Javascript or Beanshell and use the Ant API to set a property which you can access from other ant tasks.

无所谓啦 2024-08-10 20:25:27

第一个问题

使用新的 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< /a> 您可以像这样覆盖现有属性 =

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

将用新值 baz 覆盖现有属性 foo。

First question

With a new Ant addon = Flaka you may use =

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

Second question

normally properties are immutable once set in ant, but with Flaka you may overwrite an existing property like that =

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

would overwrite the existing property foo with new value baz.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文