2012-07-30 17 views
6

W pliku znajdują się następujące wiersze. Chciałbym wyodrębnić wiele danych z tego pliku.wyodrębnianie wartości z pliku za pomocą ant

Ilość bieżącego użytkownika budować listy: 23

  • 'RevisionBuild' czas Run (w minutach) = 8,40

[Zbuduj] RC = 0

I Użyto następującego wyrażenia regularnego, aby pobrać wartość 23 z tego pliku

<ac:for param="line" list="${logFileContent}" delimiter="${line.separator}"> 
    <sequential>       
<propertyregex property="noOfBuildlists" 
     input="@{line}" 
    regexp="(.*)Number of current user build lists: (.*)$" 
    select="\2"/> 
    </sequential> 
</ac:for> 

Ale to samo wyrażenie nie pobiera żadnej wartości, gdy próbuję pobrać inne linie, takie jak regexp = "(. ) [revBuild] RC = (.) $”lub Regexp = "(. ) 'RevisionBuild' czas cyklu (w minutach) = (.) $", w którym wyekstrahowane wartości powinny wynosić 0 i 8,40, odpowiednio.

Czy ktoś mógłby pomóc? Dzięki, Aarthi

Odpowiedz

9

myślę, że to, co Cię interesuje. w pliku wejściowego jak poniżej

Number of current user build lists: 23 
'RevisionBuild' Run time (in minutes) = 8.40 
[Build] RC = 0 

kiedy wykonać poniżej celu

<project name="BuildModule" basedir="." default="extract.nums"> 
    <taskdef resource="net/sf/antcontrib/antlib.xml" /> 
    <property environment="env" /> 
    <loadfile property="file" srcfile="${basedir}/inputLog.log"/> 
    <target name="extract.nums"> 
     <for param="line" delimiter="${line.separator}" list="${file}"> 
      <sequential> 
       <propertyregex property="noOfBuildlists" input="@{line}" regexp="Number of current user build lists:\s*([0-9]+)$" select="\1" /> 
       <propertyregex property="revisionBuild" input="@{line}" regexp="'RevisionBuild' Run time\s*\(in minutes\)\s*=\s*([0-9\.]+)$" select="\1" /> 
       <propertyregex property="rcBuild" input="@{line}" regexp="\[Build\] RC\s*\=\s*([0-9]+)$" select="\1" /> 
      </sequential> 
     </for> 
     <echo message="Current user build : ${noOfBuildlists}" /> 
     <echo message="Revision Build : ${revisionBuild}" /> 
     <echo message="RC Build : ${rcBuild}" /> 
    </target> 
</project> 

Podejście poniżej.

[echo] Current user build : 23 
[echo] Revision Build : 8.40 
[echo] RC Build : 0 
+0

Dzięki za tonę. Działa to bardzo dobrze. Czy możesz wyjaśnić użycie \ s *. Zauważam, że używasz tego wyrażenia za każdym razem, gdy jest spacja, po której następuje znak specjalny (taki jak (lub) lub = – user1384205

+0

'\ s' reprezentuje znak odstępu, a' \ s * 'oznacza zero lub więcej wystąpień dla białych znaków. sprawiają, że wyrażenie jest bardziej niezawodny i pasuje nawet jeśli jest więcej spacji lub jeśli nie ma ich wcale –

+0

Jeszcze raz dziękuję Vaman.Więc, aby wyszukać ciąg "Czy ta lista kompilująca wymaga kompilacji: prawda", wypróbowałem następujące wyrażenie regularne Czy ta lista wymaga compile: \ s * ([rt] +) $ Jednak wyrażenie regularne nie działa – user1384205

1

Gdy używam propertyregex, to poprosi błąd if doesn't support the nested "condition" element. W moim {android.sdk.air}/tools/ant/build.xml znajduje się wiele zagnieżdżonych elementów "warunku". Dlatego próbowałem znaleźć rozwiązanie, które może zaoferować standardowy Ant. Ja to zrobiłem.

Spróbuj to:

<loadfile 
    encoding="UTF-8" 
    property="property.for.your.string" 
    srcFile="your/file/path" > 
     <filterchain> 
      <tokenfilter> 
       <containsregex 
        pattern="Number of current user build lists:\s*([0-9]+)$" 
        replace="\1" /> 
      </tokenfilter> 
     </filterchain> 
</loadfile> 

<echo message="DEBUG LOG: property.for.your.string = ${property.for.your.string}" /> 

To sprawia, że ​​zastanawiam się, dlaczego mrówka nazwa atrybutu jako „zastąpić”, który prowadzi do mojego nieporozumień.

Powiązane problemy