2016-12-09 11 views
1

私は入力されたIPのリストとそれに対応するチケット番号を取得し、それをcsvに変換します。各IPのチケットは、リストのIPの下の行にあります。どのようにしてIPを読み取り、その下のチケット番号を解析し、その両方の値をCSV形式で出力できますか?Forループの下側の行を解析してください

私のコードとIP/Tix#のリストは以下の通りです。

m = re.search(r'(\d{1,3}.){3}\d{1,3}(-\d{2}|slash\d{2})?',item, re.M|re.I) 
n = re.search(r'10A-\d{6}',item, re.M|re.I) 
for line in fiEsccb: 
    if m in line: 
     #go to below line and extract n (possibly multiple) 
     print m + ',' + n 

一覧

8.8.8.8 
Open Menu 10A-002671 10/21/2016 

8.8.8.8 
10A-003079 

8.8.8.8 
10A-003179 10A-003178 10A-003172 10A-003171 10A-003170 

8.8.8.8 
10A-002970 

8.8.8.8 
10A-002970 
+2

投稿あなたは少なくともサンプルとして何を出力しますか – SIslam

答えて

0

itertools使用して3のタプルのリストには、グループにそれをすることができ、あなたの例のように、あなたのデータは、文字列の正規のリストが、あると仮定すると:

import itertools 
data = ['8.8.8.8', 'Open Menu 10A-002671 10/21/2016', '', '8.8.8.8', '10A-003079', '', '8.8.8.8', '10A-003179 10A-003178 10A-003172 10A-003171 10A-003170', ''] # Add more lines 

args=[iter(data)]*3 
collected = list(itertools.zip_longest(*args, fillvalue='')) 
print(collected) 
# [('8.8.8.8', 'Open Menu 10A-002671 10/21/2016', ''), ('8.8.8.8', '10A-003079', ''), ('8.8.8.8', '10A-003179 10A-003178 10A-003172 10A-003171 10A-003170', '')] 

このリストは、CSV形式で簡単に保存できます。

0

次のようなwhile Trueループとreadline()を使用して試みることができる:

while True: 
    line1 = fiEsccb.readline() 
    if m in line1: 
     line2 = fiEsccb.readline() 
     if n in line2: 
      print m + ',' + line2 
0

あなたが入力のIP texfileからのデータからリストを生成して、CSVファイルに悶え以下のように正規表現を使用することができます。

import csv,re 

ippattern = r'\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}' 
packetpattern = r'10A-\d{6}' 
data = [] 

with open(r"C:\ipinfo.txt", 'rb') as ipfile: 
    lines = ipfile.readlines() 
    for line in lines: 
     if re.search(ippattern,line): 
      ip = re.findall(ippattern,line)[0] 
      packet = re.findall(packetpattern,lines[lines.index(line)+1])[0] 
      data.append([ip,packet]) 
with open(r"C:\ipinfo_output.csv", 'wb') as ipout: 
    writer = csv.writer(ipout) 
    writer.writerows(data) 

出力CSV:

8.8.8.8,10A-002671 
8.8.8.8,10A-002671 
8.8.8.8,10A-002671 
8.8.8.8,10A-002970 
8.8.8.8,10A-002671 

このAPPR oachは不要ないくつかの複製を生成すると私は思う。これを避けるには辞書を使うことができます。ここで、ipは辞書キー、packetは辞書値です。次に、この辞書をcsvファイルに書き込みます。

また、この重複したcsvファイルをExcelにインポートして、Dataタブのmicrosoft excelで1つのコマンドを入力することもできます。

0

私が正しくあなたの問題を理解していれば、あなたは全体のラインのためのIPアドレスのための正規表現と次の行上のアイテムのチケット番号の正規表現に適用する必要があります:あなたは

fiEsccb = ['8.8.8.8', 'Open Menu 10A-002671 10/21/2016', '', '8.8.8.8', '10A-003079', '', '8.8.8.8', '10A-003179 10A-003178 10A-003172 10A-003171 10A-003170', ''] 

import re 
reIP = r'(\d{1,3}.){3}\d{1,3}(-\d{2}|slash\d{2})?' 
reTicketNr = r'10A-\d{6}' 
for line in fiEsccb: 
    line = line.strip() 
    if line == '': continue 
    mg = re.match(reIP,line) 
    if mg: 
    ip = mg.group(0) 
    else: 
    possibleTicketNrs = line.split() 
    for item in possibleTicketNrs: 
     if re.match(reTicketNr,item): 
     print(','.join([ip,item])) 

を次のようになります:

8.8.8.8,10A-002671 
8.8.8.8,10A-003079 
8.8.8.8,10A-003179 
8.8.8.8,10A-003178 
8.8.8.8,10A-003172 
8.8.8.8,10A-003171 
8.8.8.8,10A-003170 
関連する問題