arpan

arpan

Csv2Sql - Load csv files to database

Hi, everyone. I am an elixir nooby and have been learning elixir for about 6 months now. I would like to share a new project I have been working on recently.

My work involved loading lots of CSV files into MySQL databases, this was very problematic, although it was possible to read the CSV files and load it into the database using some tools or scripts, the main problem was to create the database tables before inserting the CSVs. Manually going through each CSV and preparing the query to create the corresponding table was very tedious and time taking. There were some popular tools that I found, but none of them could solve my problem completely, additionally, I also wanted to automate the whole process. So, I decided to solve the problem using elixir, this is how I made csv2sql.

Csv2Sql is a blazing fast fully automated tool to load huge CSV files into a MySQL database.

Csv2Sql can automatically…

  • Read CSV files and infer the database table structure

  • Create the database and the required tables

  • Insert all the CSV into the database

  • Validate that all the CSVs have been correctly imported to the database.

I have made an escript, which accepts command-line arguments so you can load a directory full of CSVs into the database just using a single command like:


./csv2sql --source-csv-directory "/home/user/Desktop/csvs" --db-connection-string "root:mysql@localhost/test_csv"

I used nimble CSV which is super fast when parsing the CSV files, I used ecto to easily bulk insert the CSVs into the database, but the best part is everything is done in parallel taking full advantage of elixirs cheap processes, gen servers, and supervisors. That is, multiple CSVs are processed in parallel, inferring the database schema by reading each CSV is also done in parallel, inserting the CSVs into the database is done parallelly, this makes the app very fast and makes full use of the power of the processor. I have used streams, to lazily read huge CSV files, thus it has minimal memory footprint.

I am sure that there is lots of room for improvements and bugs that will surface as I test the app further, but I wanted to share my project with the community.

Check out the project here.

Any suggestions, advice, bug report, or comments are welcome :slightly_smiling_face:.

Where Next?

Popular in Discussions Top

rower687
Hi all, I’ve been reading a lot about the “let it crash” term and how supervising processes and the whole messaging passing make an elixi...
New
joeerl
I’m playing with Elixir - It’s fun. I think @rvirding does give Elixir courses these days. Re: files and database - when I given Erlang ...
New
PragTob
Hey everyone, this has been brewing in my head some time and it came up again while reading Adopting Elixir. GenServers, supervisors et...
New
pdgonzalez872
If this has been asked here before, please point me to where it was asked as I didn’t find it when I searched the forum. Maybe a mailing ...
New
dogweather
I wrote this comment on r/haskell, and it’s not popular there. :wink: But I think I’m on to something… Haskell reminds me of Java, and e...
New
Nvim
Elixir appears to be a superior language to Python. I don’t see any advantage of Python over Elixir. Are there any?
New
AstonJ
Can you believe the first professionally published Elixir book was published just 8 years ago? Since then I think we’ve seen more books f...
New

Other popular topics Top

nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 44608 311
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

We're in Beta

About us Mission Statement