1

Check Point ファイアウォール ポリシーからの HTML エクスポートを使用して作成した CSV ファイルがあります。各ルールは、場合によっては複数の行で表されます。これは、ルールに複数のアドレス ソース、宛先、またはサービスがある場合に発生します。各ルールを 1 行だけで記述した出力が必要です。各ルールの開始時期を簡単に区別できます。最初の列には、数字であるルール ID があります。

例を次に示します。移動する必要がある文字列は緑色でマークされています。

http://i.imgur.com/i785sDi.jpg

例を示しましょう。

NO.;NAME;SOURCE;DESTINATION;SERVICE;ACTION;
1;;fwgcluster;mcast_vrrp;vrrp;accept;
;;;;igmp;;
2;Testing;fwgcluster;fwgcluster;FireWall;accept;
;;fwmgmpe;fwmgmpe;ssh;;
;;fwmgm;fwmgm;;;

疑似コードで説明されている必要なものは次のとおりです。

次の行の最初の列を読み取ります。数字がある場合: 次の行の最初の列を評価します。そこに番号がない場合は、この行の列の文字列を最後の列と連結 (コンマで区切る) し、現在の列のテキストを削除します

出力は次のようになります。

NO.;NAME;SOURCE;DESTINATION;SERVICE;ACTION;
1;;fwgcluster;mcast_vrrp;vrrp-igmp;accept;
;;;;;;
2;Testing;fwgcluster-fwmgmpe-fwmgm;fwgcluster-fwmgmpe-fwmgm;FireWall-ssh;accept;
;;;;;;
The empty lines are there only to be more clear, I don't actually need them.

ありがとう!

4

2 に答える 2

2

これで始められるはずです

import csv

with open('data.txt', 'r') as f:
    reader = csv.DictReader(f, delimiter=';')
    for r in reader:
        print r

編集:必要な出力が与えられれば、これでほぼそこに到達するはずです。少し粗雑ですが、必要なことの大部分を行います。「いいえ」をチェックします。キーであり、値があればレコードを開始します。そうでない場合、行内の他のデータをレコード内の同等のデータと結合します。最後に、新しいレコードが作成されると、古いレコードが結果に追加されます。これは、最後のアイテムをキャッチするために最後にも発生します。

import csv

result, record = [], None
with open('data2.txt', 'r') as f:
    reader = csv.DictReader(f, delimiter=';', lineterminator='\n')
    for r in reader:
        if r['NO.']:
            if record:
                result.append(record)
            record = r
        else:
            for key in r.keys():
                if r[key]:
                    record[key] = '-'.join([record[key], r[key]])
    if record:
        result.append(record)

print result                    
于 2013-10-10T20:48:01.617 に答える
0

Graeme、ありがとうございます。編集の直前に、次のコードで解決しました。しかし、あなたは私を正しい方向に向けさせました!

誰かがそれを必要とするなら、ここにあります:

import csv 
# adjust these 3 lines 
WRITE_EMPTIES = False 
INFILE = "input.csv"
OUTFILE = "output.csv"
with open(INFILE, "r") as in_file: 
  r = csv.reader(in_file, delimiter=";") 
  with open(OUTFILE, "wb") as out_file: 
    previous = None 
    empties_to_write = 0 
    out_writer = csv.writer(out_file, delimiter=";") 
    for i, row in enumerate(r): 
      first_val = row[0].strip() 
      if first_val: 
        if previous: 
          out_writer.writerow(previous) 
          if WRITE_EMPTIES and empties_to_write: 
            out_writer.writerows( 
              [["" for _ in previous]] * empties_to_write 
              ) 
            empties_to_write = 0 
        previous = row 
      else: # append sub-portions to each other 
        previous = [ 
          "|".join( 
            subitem 
            for subitem in existing.split(",") + [new] 
            if subitem 
            ) 
          for existing, new in zip(previous, row) 
          ] 
        empties_to_write += 1 
    if previous: # take care of the last row 
      out_writer.writerow(previous) 
      if WRITE_EMPTIES and empties_to_write: 
        out_writer.writerows( 
          [["" for _ in previous]] * empties_to_write 
          ) 
于 2013-10-13T00:13:05.713 に答える