1

Pythonを使用してSVNのXMLログをCSVに変換しています...

#!/usr/bin/env python

import csv
import subprocess
import sys
import xml.etree.cElementTree as etree

log_text = subprocess.Popen(['svn', 'log', '--xml'] + sys.argv[1:],
                            stdout=subprocess.PIPE).communicate()[0]
log_xml = etree.XML(log_text)

csv_writer = csv.writer(sys.stdout)

for child in log_xml.getchildren():
        csv_writer.writerow([
                child.attrib['revision'],
                child.findtext('date'), 
                child.findtext('author').encode('utf-8'),
                child.findtext('msg').encode('utf-8'),
        ])

たとえば、出力が得られます...

2022,2013-01-02T06:11:40.500850Z,dave.d@email.com,"Ticket 16057735 - Blah "
2023,2013-01-02T06:43:22.247709Z,john.c@email.com,Ticket:16060718 Blah Blah
2027,2013-01-02T07:43:00.326583Z,dave.d@email.com,Ticket 16060936 - Blah Blah

<msg>しかし、.csv出力の作成中にチケット番号のみを取得するためにフィルタリング/解析したいと考えています。

perl を使用するなどの代替手段は問題ありません。

更新:コメントにチケット #### がないリビジョンのログをスキップする方法 ( <msg>)

4

1 に答える 1

1

簡単な解決策は次のとおりです。Ticket という単語の後の最初の数字を探します。

if ($line =~ /Ticket\D+(\d+)/)
{
    $ticket_number = $1;
}

Perl 構文を使用しますが、Python でも同様に簡単なはずです。

これはPythonバージョンでの刺し傷です(警告、私はPythonプログラマーではありません):

matchObj = re.match( r'Ticket\D+(\d+)', child.findtext('msg').encode('utf-8'))

if matchObj:
   print matchObj.group(1)

正規表現Ticket\D+(\d+)は、単語 ticket、次に数字ではない 1 つ以上の文字 ( \D+)、1 つ以上の数字 ( \d+) に一致します。括弧は、最初に一致したグループのパターンの囲まれた部分をキャプチャします。

一致をより具体的にしたい場合は、 を使用(\d{8})して、チケット番号が 8 桁であることを確認できます。

更新:これらのソリューションはどちらもifステートメントを使用して、パターンが一致したことを示します。一致しない行をスキップするだけで、チケット番号のない行をスキップできます。

于 2013-03-05T10:47:09.247 に答える