gpt4 book ai didi

从字符串中挑选单词的 Ant 任务

转载 作者:行者123 更新时间:2023-12-04 06:32:21 27 4
gpt4 key购买 nike

假设我有字符串 - "D:\ApEx_Schema\Functions\new.sql@@\main\ONEVIEW_Integration\3"
我需要将以下内容提取到 diff 变量中
- 文档名称
- 文件路径
- 和版本(这是字符串的最后一个字符)

请帮助使用 ANT 任务

======================================
我正在尝试读取包含如下数据的 txt 文件:-

.\ApEx_Schema\Functions\new.sql@@\main\ONEVIEW_Integration\3

.\ApEx_Schema\Functions\Functions.sql@@\main\ONEVIEW_Integration\3

.\ApEx_Schema\Indexes\Indexes.sql@@\main\ONEVIEW_Integration\2

并尝试收集文件名、其路径详细信息及其版本,并使用 SQL 任务在数据库中更新它们。
虽然我的 build.xml 没有按需要提供输出。
任何建议和意见!!!

我的 Build.xml 文件看起来像 -
==============开始============================
<description>
obiee copy files build file
</description>



<replace file="D:\buildFRIDAY\database.txt" token=".\" value="D:\"/>  
<loadfile property="src" srcFile="D:\buildFRIDAY\database.txt"/>

<path id="antclasspath">
<fileset dir="D:\OraHome_1\oracledi\drivers">
<include name="ojdbc14.jar"/>
</fileset>
</path>

<for list="${src}" param="detls" delimiter="${line.separator}">
<sequential>
<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
<propertyregex property="path" input="@{detls}"
regexp="(.*)\\.*@@" select="\1" />
<propertyregex property="file" input="@{detls}"
regexp=".*\\(.*)@@" select="\1" />
<propertyregex property="version" input="@{detls}"
regexp=".*\\(.*)" select="\1" />

<echo>
Input: @{detls}
Path: ${path}
File: ${file}
Version: ${version}
</echo>

<if>
<matches string="@{detls}" pattern=".sql" />
<then>

</then>
</if>

<if>
<matches string="@{detls}" pattern="[0-9]" />
<then>
<sql
driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@172.16.88.68:1521:rdev"
userid="rapid"
password="rapid"
print="yes"
classpathref="antclasspath">

Insert into ROLTA_PATCH_FILE_APP_TAB (PATCH_NO,FILE_NAME,FILE_PATH,FILE_VERSION,APPLIED_DATE,STATUS) values ('3.2.12',"@{detls}",'D:\ApEx_Schema\Functions\Functions.sql','3',to_date('11-MAR-11','DD-MON-RR'),'Y');

Insert into ROLTA_PATCH_TAB (PATCH_NO,PATCH_NAME,APPL_NAME,APPLIED_DATE) values ('3.2.12','2.1.11','@{detls}',to_date('11-MAR-11','DD-MON-RR'));
</sql>
</then>
</if>
</sequential>
</for>



==============END============================

最佳答案

这不是 Ant 擅长的事情。
可能最简单的解决方案是使用 ant-contrib propertyregex task :

<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>

<property name="candidate"
value="D:\ApEx_Schema\Functions\new.sql@@\main\ONEVIEW_Integration\3" />

<propertyregex property="path" input="${candidate}"
regexp="(.*)\\.*@@" select="\1" />
<propertyregex property="file" input="${candidate}"
regexp=".*\\(.*)@@" select="\1" />
<propertyregex property="version" input="${candidate}"
regexp=".*\\(.*)" select="\1" />

<echo>
Input: ${candidate}
Path: ${path}
File: ${file}
Version: ${version}
</echo>

这涉及获取 ant-contrib 任务集合的 jar。

A - 非常讨厌 - 另一种选择是使用 scriptdef task .
<scriptdef name="get_elements" language="javascript">
<attribute name="candidate" />
<attribute name="path-property" />
<attribute name="file-property" />
<attribute name="version-property" />
<![CDATA[
filesep = project.getProperty( "file.separator" );
candidate = attributes.get( "candidate" );
path = candidate.substring( 0, candidate.indexOf( "@@" ) );
file = path.substring( path.lastIndexOf( filesep ) + 1 );
path = path.substring( 0, path.lastIndexOf( filesep ) );
version = candidate.substring( candidate.lastIndexOf( filesep ) + 1 );

project.setProperty( attributes.get( "path-property" ), path );
project.setProperty( attributes.get( "file-property" ), file );
project.setProperty( attributes.get( "version-property" ), version );
]]>
</scriptdef>

<property name="candidate"
location="D:\ApEx_Schema\Functions\new.sql@@\main\ONEVIEW_Integration\3"
relative="yes" />
<get_elements candidate="${candidate}"
path-property="path"
file-property="file"
version-property="version" />
<echo>
Input: ${candidate}
Path: ${path}
File: ${file}
Version: ${version}
</echo>

(注意:在 unix 操作系统上进行了测试,因此如果在 Windows 上,您可能需要调整路径分隔符处理。)

更新:

关于您的实现的一些说明。

您可能需要命名“for”任务:
<ac:for list="${src}" param="detls" delimiter="${line.separator}"
xmlns:ac="antlib:net.sf.antcontrib">
...
</ac:for>

如果你想要 propertyregex要更改属性(您在迭代时执行的操作),您需要设置
override="yes"在每一个。
内部 for您需要转义 at 标志,例如:
<propertyregex property="path"
input="@{detls}"
regexp="(.*)\\.*\@\@" select="\1"
override="yes"/>

引用 propertyregex 设置的属性使用 ${path}而不是 @{path} .

关于从字符串中挑选单词的 Ant 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5256357/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com