2015-11-02 108 views
0

我有两个工作簿:比较值

  • wkbk1具有在特定列的每个小区中的单个IP地址。
  • wkbk2没有IP地址,单个IP或多个IP, 在特定的 列的每个单元格中以新行(vs逗号)分隔。

我想比较wkbk1中的单元格的值与wkbk2中的值。

我遇到的问题是,搜索将比较wkbk1 IP = 10.10.10.16等于wkbk2 IP = 10.10.10.168(和任何其他变体)。

如果我通过(wkbk1 IP + \ n)进行搜索,它无法比较单行单元格。

以下是我的代码:

#variable top store the highest row number 
mRow = str(mapIP.get_highest_row()) 
eRow = str(assetSheet.get_highest_row()) 

i = 2 #variable for row number output, skips the first row (b/c it is the header row, duh) 

#create data by comparing IP in map to IP in CMDB 
for mapIpRow in mapIP['A1':'A' + mRow]: 
     for mapIpCell in mapIpRow: 
      for assetIpRow in assetSheet['E1':'E' + eRow]: 
       for assetIpCell in assetIpRow: 
        assetIp = str(assetIpCell.value) 
        mapIp = str(mapIpCell.value) 
        if mapIp in assetIp: 
         outSheet['A' + str(i)].value = mapIp 
         print(mapIp) #just for feedback that the program is running 
         dnsM = mapIP['B' + str(mapIpCell.row)].value 
         owner = assetSheet['F' + str(assetIpCell.row)].value 
         dnsQ = assetSheet['B' + str(assetIpCell.row)].value #cishort 
         dnsQ2 = assetSheet['C' + str(assetIpCell.row)].value #cialias 
         dnsQ3 = assetSheet['D' + str(assetIpCell.row)].value #ciDesc 
         ciIP = assetSheet['E' + str(assetIpCell.row)].value #ciIP 
         ciID = assetSheet['A' + str(assetIpCell.row)].value #ciID 
         outSheet['B' + str(i)].value = dnsM 
         outSheet['C' + str(i)].value = owner 
         outSheet['D' + str(i)].value = dnsQ 
         outSheet['E' + str(i)].value = dnsQ2 
         outSheet['F' + str(i)].value = dnsQ3 
         outSheet['G' + str(i)].value = ciIP 
         outSheet['H' + str(i)].value = ciID 
         print owner #just for feedback that the program is running 
         i = i + 1 
        else: 
         pass 

回答

0

取每个单元的值(其可以含有0,1或多个IP地址),并把它放入使用.split('\n')列表。您的列表比较if mapIp in assetIp仍然可以正常工作。

assetIp = assetIpCell.value.split('\n') if assetIpCell.value else '' 
mapIp = str(mapIpCell.value) 
if mapIp in assetIp: 

这应该解决您的问题:

我遇到的问题是,搜索将比较一个wkbk1 IP = 10.10.10.16为等于wkbk2 IP = 10.10.10.168(以及任何其他变体)。

in操作比较字符串时,会返回串的结果,即:

'a' in 'David' == True 
'10.10.10.16` in `10.10.10.168` == True 

与列表中使用将返回Truein运营商只有精确匹配在列表中存在;

'10.10.10.16`' in ['10.52.1.1', '99.32.9.0', '168.152.1.1', `10.10.10.168`] == False 
+0

这工作完美!我不得不将assetIpCell.value转换为一个字符串,然后分割成一个列表。非常感谢! – MACanazon

+0

干杯。如果解决了问题,请考虑将此答案标记为“已接受”。出于好奇,“assetIpCell.value”中的数据类型是以什么开头的?我希望它是字符串(但我没有测试) –

+1

它是一个IP地址的单元格,它们由回车而不是逗号分隔。但是有些单元格是空的,他们将被分配一个Nonetype – MACanazon