What I have done in the past is to do the load into a temporary table and have all the columns as character-based with max-length allowed / expected. Then, after all the input columns, I would add the columns as their final data format so they wont have any impact on import stream / comma/tab delimited format.
Once the data is imported into the temp table, then run an update query to get to the final format of int, decimal, float, bit, date/time, etc.
Finally, if all goes well, then you can do all your queries or insert into from the select from the temp file as needed for final import.
Ex:
temp table has
FirstName varchar(20),
LastName varchar(20),
BirthDateText varchar(10),
SalaryText varchar(10),
AnyOtherColumns varchar(10),
RealBirthDate Timestamp
Salary decimal
So, the import fills up from FirstName to the AnyOtherColumns, but now you can run update commands to properly convert into the respective REALBirthDate and Salary columns of data.
No third-party, completely under your control and data cleansing can be done / validated before it goes into its final destination too.