Suppose that the information for constructing a dataset is split over two separate files: one file contains the numeric data, and a second file contains the names of the columns.

Is there a simple way to create a dataset from these two separate files?

columnames=CharacterRange["a","h"];
data= RandomInteger[9,{20,8}];



OK, I found a second way. Like kglr's solution, this one also uses AssociationThread, but applies it only once:

makeDataset[columns_, columnLabels_] := Module[{labeledColumns, records},

The importer can be easily written in terms of makeDataset:
readDataset[datafile_, headerfile_] := Module[{columns, columnLabels},