def _get_exec_table_data(headers):
    """Extract a stats table from execution HTTP response headers.

    Stats include things like node name, execution time, number of
    reads/writes, bytes read/written, etc.

    :param dict headers:
        `dict` of response headers from a job execution request. It must
        contain at least ``x-nexe-system``, ``x-nexe-status``,
        ``x-nexe-retcode``, ``x-nexe-cdr-line``.
    :returns:
        Tuple of two items. The first is the total time for the executed job
        (as a `str`). The second is a table (2d `list`) of execution data
        extracted from ``X-Nexe-System`` and ``X-Nexe-Cdr-Line`` headers.

        Each row in the table consists of the following data:

            * node name
            * node time
            * system time
            * user time
            * number of disk reads
            * number of bytes read from disk
            * number of disk writes
            * number of bytes written to disk
            * number of network reads
            * number of bytes read from network
            * number of network writes
            * number of bytes written to network
    """
    node_names = iter(headers['x-nexe-system'].split(','))
    statuses = iter(headers['x-nexe-status'].split(','))
    retcodes = iter(headers['x-nexe-retcode'].split(','))

    cdr = headers['x-nexe-cdr-line']
    cdr_data = [x.strip() for x in cdr.split(',')]
    total_time = cdr_data.pop(0)
    cdr_data = iter(cdr_data)

    def adviter(x):
        return six.advance_iterator(x)

    table_data = []
    while True:
        try:
            node_name = adviter(node_names)
            status = adviter(statuses)
            retcode = adviter(retcodes)
            node_time = adviter(cdr_data)
            cdr = adviter(cdr_data).split()
            row = [node_name, status, retcode, node_time] + cdr
            table_data.append(row)
        except StopIteration:
            break
    return total_time, table_data