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

scouten
I’m looking for a host for the server part of a small (personal) side project that I’m working on. It’s currently written in Node.js and ...
New
AlexMcConnell
The reason that Rails is as popular as it is is because it’s very easy for relatively inexperienced developers to get a lot of work done....
588 20070 166
New
Fl4m3Ph03n1x
Background A few days ago I was listening to The future of Elixir from Elixir Talks, with Dave Thomas (@pragdave ) and Brian Mitchell. I...
New
nunobernardes99
Hi there Elixir friends :vulcan_salute: In a recent task I was on, I needed to check in two dates which of them is the maximum and which...
New
pillaiindu
I want to convert a Phoenix LiveView CRUD website to a CRUD mobile app. What do you think is the easiest way to do so?
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
fireproofsocks
I’ve been working on an Elixir project that has required a lot of scripting. I usually reach for Elixir because I like it more (and in th...
New

Other popular topics Top

Qqwy
Update: How to use the Blogs & Podcasts section You can post links to your blog posts or podcasts either in one of the Official Blog...
3271 130579 1222
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 54092 488
New
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
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
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 44167 214
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New

We're in Beta

About us Mission Statement