用防火墙规则合并CSV文件的几行,以便更容易地解析它们?

2024-09-28 22:10:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个CSV文件,它是我使用Check-Point防火墙策略的HTML导出创建的。 在某些情况下,每个规则都表示为几行。当规则具有多个地址源、目标或服务时,会发生这种情况。 我需要在输出中只在一行中描述每个规则。 很容易区分每一条规则何时开始。在第一列中,是规则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;;;

我需要的是,用伪代码解释的是:

读下一行的第一栏。如果有号码: 计算下一行的第一列。如果没有数字,连接(用逗号分隔)\ 此行列中的字符串与最后一个字符串并消除当前字符串中的文本

输出应该如下所示:

^{pr2}$

谢谢!在


Tags:
文件csv字符串规则check情况数字例子
2条回答

格雷姆,再次感谢,就在你编辑之前,我用下面的代码解决了这个问题。 但你让我看到了正确的方向!在

如果有人需要的话,这里有:

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 
          ) 

这应该能让你开始

import csv

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

编辑:考虑到您所需的输出,这应该可以让您接近目标。它有点粗糙,但它能满足你的大部分需求。它检查“No”键,如果它有值,它将启动一个记录。否则,它将把行中的任何其他数据与记录中的等效数据联接起来。最后,当一个新记录被创建时,旧记录会被追加到结果中,这也会在结尾处发生,以捕获最后一个项目。在

^{pr2}$

相关问题 更多 >