I have a feeling I am copying the data into memory several times, but I do not know how to avoid this.
Rewrite your program into subroutines, use lots of references, and watch the size of your program at each stage
There is a lot of copy/paste duplication in your program that should be rewritten
There are a lot of short variable names, way too many to keep track of, way too many to help you substantially rewrite what you posted
Also you say The total amount of rows is close to 1 million. and that is close to the MAXIMUM LIMIT for Excel of 1,048,576 rows by 16,384 columns
You might switch to DBD::SQLite, see Loading 283600 records (WordNet), Re: Is there a way(maybe tool?) to know the amount of memory an array takes?, dynamic bulk insert in sqlite