JavaScript: leggere il contenuto di un file CSV con le API HTML5

JavaScript: leggere il contenuto di un file CSV con le API HTML5

Con l'introduzione delle API HTML5 per i file in JavaScript si aprono scenari impensabili fino a qualche anno fa.

Data la seguente marcatura:


<input type="file" name="csv" id="csv">

e presupponendo un file CSV così strutturato:


A,B,C
1,2,3
4,5,6
...

possiamo scrivere il seguente codice JavaScript:


'use strict';

(function() {
	const Importer = function( element ) {
		// element è il nostro input
		this.el = document.querySelector( element );
		this.init();
	};
	
	Importer.prototype = {
		init() {
			this.change();
		},
		change() {
			const self = this;
			
			function readFile( file ) {                                                       
    			const reader = new FileReader(); // Istanza di FileReader
    			reader.onload = readSuccess;  // Leggiamo il file quando è stato caricato
    			                                          
    			function readSuccess( evt ) {
	    			// result racchiude i contenuti del file                         
        			const csv = self._parseCSV( evt.target.result );
        			self._insertData( csv );                                
    			}
    			
    			reader.readAsText( file ); // Leggiamo il file come testo                                              
			} 

			this.el.addEventListener( "change", function( e ) {
				
				 const files = e.target.files; // Array dei file legati al campo
				 const file = files[0]; // File selezionato
				 
				 if( !files.length ) { // Nessun file?
				 	alert( "Seleziona un file" );
				 	return;
				 }
				 if( !/csv/.test( file.type ) ) { // Solo file .csv
				 	alert( "Solo file CSV" );
				 	return;
				 }
				 
				 readFile( file ); // Leggiamo il file

			}, false);
		},
		_parseCSV( str ) {
			const lines = str.split( /\n/ ); // Otteniamo un array di righe
			const data = lines.slice( 1, lines.length ); // Eliminiamo le intestazioni CSV
			let items = [];

			for( let i = 0; i < data.length; ++i ) {
				let line = data[i];
				let parts = line.split( "," ); // Otteniamo un array di valori
                let [a, b, c] = parts;

				let item = {
					a,
					b,
					c
				};
				
				// Creiamo un array di oggetti

				items.push( item );
			}

			return items;
		},
		_insertData( items ) {
			// Inserisce i dati
		}
	};

	document.addEventListener( "DOMContentLoaded", function() {
		const importerInstance = new Importer( "#csv" );
	});
	
})();