'Read the table data from the ASCII file output by BinTableHDU.dump().'

@classmethod
def _load_data(cls, fileobj, coldefs=None):

    close_file = False
    if isinstance(fileobj, string_types):
        fileobj = open(fileobj, 'r')
        close_file = True
    initialpos = fileobj.tell()
    linereader = csv.reader(fileobj, dialect=FITSTableDumpDialect)
    vla_lengths = []
    recformats = []
    names = []
    nrows = 0
    if (coldefs is not None):
        recformats = coldefs._recformats
        names = coldefs.names
    def update_recformats(value, idx):
        fitsformat = _scalar_to_format(value)
        recformat = _convert_format(fitsformat)
        if (idx >= len(recformats)):
            recformats.append(recformat)
        elif (_cmp_recformats(recformats[idx], recformat) < 0):
            recformats[idx] = recformat
    for row in linereader:
        nrows += 1
        if (coldefs is not None):
            continue
        col = 0
        idx = 0
        while (idx < len(row)):
            if (row[idx] == 'VLA_Length='):
                if (col < len(vla_lengths)):
                    vla_length = vla_lengths[col]
                else:
                    vla_length = int(row[(idx + 1)])
                    vla_lengths.append(vla_length)
                idx += 2
                while vla_length:
                    update_recformats(row[idx], col)
                    vla_length -= 1
                    idx += 1
                col += 1
            else:
                if (col >= len(vla_lengths)):
                    vla_lengths.append(None)
                update_recformats(row[idx], col)
                col += 1
                idx += 1
    for (idx, length) in enumerate(vla_lengths):
        if (length is not None):
            recformats[idx] = (str(length) + recformats[idx])
    dtype = np.rec.format_parser(recformats, names, None).dtype
    hdu = BinTableHDU.from_columns(np.recarray(shape=1, dtype=dtype), nrows=nrows, fill=True)
    data = hdu.data
    for (idx, length) in enumerate(vla_lengths):
        if (length is not None):
            arr = data.columns._arrays[idx]
            dt = recformats[idx][len(str(length)):]
            recformats[idx] = _FormatP(dt, max=length)
            data.columns._recformats[idx] = recformats[idx]
            name = data.columns.names[idx]
            data._cache_field(name, _makep(arr, arr, recformats[idx]))
    def format_value(col, val):
        if (recformats[col] == FITS2NUMPY['L']):
            return bool(int(val))
        elif (recformats[col] == FITS2NUMPY['M']):
            return complex(val)
        else:
            return val
    fileobj.seek(initialpos)
    linereader = csv.reader(fileobj, dialect=FITSTableDumpDialect)
    for (row, line) in enumerate(linereader):
        col = 0
        idx = 0
        while (idx < len(line)):
            if (line[idx] == 'VLA_Length='):
                vla_len = vla_lengths[col]
                idx += 2
                slice_ = slice(idx, (idx + vla_len))
                data[row][col][:] = line[idx:(idx + vla_len)]
                idx += vla_len
            elif dtype[col].shape:
                array_size = int(np.multiply.reduce(dtype[col].shape))
                slice_ = slice(idx, (idx + array_size))
                idx += array_size
            else:
                slice_ = None
            if (slice_ is None):
                data[row][col] = format_value(col, line[idx])
                idx += 1
            else:
                data[row][col].flat[:] = [format_value(col, val) for val in line[slice_]]
            col += 1
    if close_file:
        fileobj.close()
    return data
