@classmethod
def from_file_csv(cls, f):
    """Import an organizational model from an external CSV file.

        Parameters
        ----------
        f: File object
            A sourced CSV file to be read.

        Returns
        -------
        OrganizationalModel
            The imported organizational model.

        Notes
        -----
        Data exchange format in the CSV file (by each line):

        * No header line; 
        * 3 columns: Group ID, Member resource IDs, Execution modes
        * Values of member resource IDs and execution modes are separated
          by semicolons ``;`` within the columns;
        * A vertical bar ``|`` is used as the separator for values of the
          three types within an execution mode.
        
        An example is given as follows:

        ======== =========================== ========================
        GroupID1 Resource ID 1;Resource ID 2 CT1|AT2|TT1;CT.0|AT2|TT3
        -------- --------------------------- ------------------------
        GroupID2 Resource ID 3;Resource ID 4 CT1|AT3|TT1;CT.0|AT2|TT4
        ======== =========================== ========================

        See Also
        --------
        OrganizationalModel.to_file_csv
        """
    from csv import reader
    om_obj = cls()
    for row in reader(f):
        if not row:
            continue
        group = row[1].split(';')
        exec_modes = list()
        for str_mode in row[2].split(';'):
            exec_modes.append(tuple(str_mode.split('|')))
        om_obj.add_group(group, exec_modes)
    return om_obj
