Ferruccioboss

Codice per recupero e filtraggio asincrono di CSV multipli

Jun 21st, 2016
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //CSV di test utilizzati
  2. //
  3. //roma.csv
  4. //Data,mercurio,cromo
  5. //2005/5/12,56,22
  6. //2002/8/25,2,300
  7. //2011/1/1,30,6
  8. //
  9. //milano.csv
  10. //Data,cadmio
  11. //2001/5/2,33
  12. //2004/3/30,3
  13. //2014/2/5,2
  14. //
  15.  
  16. //funzione che esegue la chiamata asincrona, callbacks per inserire filtri
  17. function multiCsv(selString, callback) {
  18.   var results = [];
  19.   var error = "";
  20.   var files = [];
  21.   //ciclo per trovare path file csv
  22.   for (var i = 0; i < selString.length -1; i++) {
  23.         if (i%2 !== 0) {
  24.             cittaSelezionata = selString[i-1].replace("-",".");
  25.             var path = location.origin+"/CSV/"+cittaSelezionata+".csv";
  26.             //compongo array con path csv
  27.             files.push(path);
  28.         }
  29.   }
  30.   //conto quanti file sono
  31.   var filesLength = (files || []).length;
  32.   var callbackInvoked = false;
  33.   //ciclo tra i file
  34.   for (var i = 0; i < filesLength; i++) {
  35.     //definisco funzione anonima per ciclare
  36.     (function(url) {
  37.         //apro file
  38.       d3.csv(url, function(data) {
  39.         if (data === null) {
  40.           error += "Error retrieving \"" + url + "\"\n";
  41.         } else {
  42.              //inserisco i dati nello stile di nvd3 poi inserisco chiave e tolgo campi in eccesso
  43.           results.push({values: data , key: NaN});
  44.         }
  45.         // all files retrieved or an error occurred
  46.         if (!callbackInvoked && (error || results.length === filesLength)) {
  47.           if (error) {
  48.             callback(error, null);
  49.           } else {
  50.             callback(null, d3.merge(results));
  51.           }
  52.           callbackInvoked = true;
  53.         }
  54.       });
  55.       //definisco argomenti per eseguire funzione
  56.     })(files[i]);
  57.   }
  58. }
  59.  
  60. //funzione per filtrare i dati dentro la chimata asincrona
  61. function filterData(results, selString) {
  62.     var chiavi = [];
  63.     var sostanze = [];
  64.     var maxYindex = 0;
  65.     //creo array ordinati di chiavi e sostanze
  66.     for (var i = 0; i < selString.length -1; i++) {
  67.         if (i%2 !== 0) {
  68.             cittaSelezionata = selString[i-1].replace("-",".");
  69.             sostanzaSelezionata = selString[i];
  70.             chiave = cittaSelezionata + "#" + sostanzaSelezionata;
  71.             chiavi.push(chiave);
  72.             sostanze.push(sostanzaSelezionata);
  73.         }
  74.     }
  75.     //ciclo sopra i dati in uscita dai file
  76.     for (var i = 0; i < results.length; i++) {
  77.         //assegno la chiave che non ho inserito prima
  78.         results[i].key = chiavi[i];
  79.         var riferimento = 0;
  80.         //array temporaneo per salvare oggetti {x,y}
  81.         var tmpA = [];
  82.         //ciclo attraverso i valori
  83.         for (var c = 0; c < results[i].values.length; c++) {
  84.             //oggetto temporaneo per salvare x e y
  85.             tmpO = new Object();
  86.             // data parsata
  87.             tmpO.x = d3.time.format("%Y/%m/%d").parse(results[i].values[c].Data).getTime();
  88.             // sostanza inserita
  89.             tmpO.y = parseInt(results[i].values[c][sostanze[i]]);
  90.             //controllo per ripulire i doppioni di date
  91.             if(tmpO.x > riferimento){
  92.                 //controllo per ripulire tutti i numeri con "<" davanti, se c'è stampo 0
  93.                 if(!isNaN(tmpO.y)){
  94.                     //salvo il valore più alto in assoluto per poi fissare l'asse y nel grafico principale
  95.                     if (tmpO.y > maxYindex) maxYindex = tmpO.y;                            
  96.                 }else{
  97.                     tmpO.y = 0;
  98.                 }
  99.                 // ricreo oggetto con solo i dati che mi servono
  100.                 tmpA.push(tmpO);
  101.          }
  102.          //assegno nuovo riferimento
  103.             riferimento = tmpO.x;
  104.         }
  105.         //sovrascrivo porzione di oggetto con nuovo array
  106.         results[i].values = tmpA;  
  107.     }
  108.     //ritorno il nuovo oggetto e l'indice massimo  
  109.     return [results, maxYindex];
  110. }
  111.  
  112. // funzione per simulare checkbox    
  113. function aggiungiElemento() {
  114.     return "roma#mercurio#milano#cadmio#roma#cromo#";
  115. }
  116.  
  117. var selString = aggiungiElemento().split("#");
  118.  
  119. multiCsv(selString, function (err, results) {
  120.   if (err) {
  121.     alert(err);
  122.     return;
  123.   }
  124.   //ATTENZIONE
  125.   //eventuale altro codice va eseguito qui dentro poichè il caricamento è asincrono
  126.   //e quindi il codice fuori da questa funzione viene eseguito dopo che ha finito di caricare i CSV
  127.   [results, maxYindex] = filterData(results, selString);
  128.   console.log(results);
  129.   console.log(maxYindex);
  130. });
Advertisement
Add Comment
Please, Sign In to add comment