Python将具有空单元格的Matrix样式字符串解析为二维列表

时间:2018-08-07 12:13:06

标签: python parsing matrix split

我从paramiko SSH收到了这样的输出,我试图将其转换为列表列表(二维列表):

===============================================================================
Card State
===============================================================================
Slot/  Provisioned      Equipped         Admin Operational   Num   Num Comments
Id     Type             Type             State State         Ports MDA         
-------------------------------------------------------------------------------
1      iom-sar          iom-sar          up    up                  6           
1/1    a16-chds1        a16-chds1        up    up            16                
1/2    a8-ethv2         a8-ethv2         up    up            8                 
A      csm-1g           csm-1g           up    up                      Active  
B      csm-1g           csm-1g           up    up                      Standby 
===============================================================================

这作为单个字符串返回。我可以使用splitline()划分行,但是由于存在一些空值,因此我无法检测到列,而且我无法使Python理解如何从单元格之间的空格中区分出空单元格。

例如,以“ 1 iom-sar”开头的第一行应分为8个单元格,例如标题列“ Slot / Provisioned Equipped Admin Operational Num Num Comments”

我有一个想法,就是找到标题列,以某种方式找到每个标题的开头,并且由于每个行值都与标题值对齐,因此进行相应的划分。有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

好的,这是我到目前为止提出的解决方案:

首先使用

逐行拆分字符串
<div class="container">
    <table id="myDataTable" class="table table-bordered">
        <thead>
            <tr>
                @foreach (var item in criSelectedColumn.Columns)
                {
                    <th>
                        @item
                    </th>
                }
            </tr>
        </thead>

        <tbody>
            @foreach (var item in criSelectedColumn.Data)
            {
                <tr>
                    @foreach (var itemItem in @item.GetType().GetFields().Where(x => !x.Name.Contains("Set") && !x.Name.Contains("Get")))
                    {
                        <td>
                            @itemItem.GetValue(item)
                        </td>
                    }
                </tr>
            }
        </tbody>
    </table>
</div>

遍历列表a,将其在空格处分割并计数列表元素(以找到最长的长度以查找列数。存储包含最多元素的行的行号(又称标题行或一整行)

a=output_string.splitline()

将标题行拆分为列表

longest_line=0
length=0
for i in range(len(a)):
   if len(a.split())>length:
      length=len(a.split())
      longest_line=i

找到每个标题元素的开始位置并存储

b=a[longest_line].split() 

从起始位置切线

startpositions=[]
for i in b:
    startpositions.append(a.find(i))

这就像一个伪代码/算法。我认为这将不起作用,存在索引问题,并且可以优化列表和声明。