0
votes

Cartographie des données CSV en nouvelle structure

J'ai un CSV qui contient les données suivantes

 d3.csv('churn_status.csv')
    .then(function(data) {

        vm.graph.nodes = data.reduce(function(acc, line){
            return acc.concat(Object.entries(line).map(function(column){
                return {name: column[0], node: column[1]}
            }))}, []);


        vm.graph.nodes = vm.graph.nodes.sort(function(a,b) { return a.name > b.name ? -1 : 1});
    })
    .catch(function(error){
        // handle error
    });


3 commentaires

avez-vous regardé la sortie: tout est indéfini


Il est indéfini car il est d'accéder aux clés d.current_montth et d.value qui n'existe pas. Voulez-vous des groupes par des valeurs uniques? Ou faites simplement les nœuds comme exemple?


Bonjour, ce serait unique pour chaque colonne, de sorte qu'il se termine comme ma sortie. Désolé, Current_Month était censé être ceci_year, jouait avec elle.


3 Réponses :


0
votes

La fonction de fonction de carte D n'a pas de propriété "actuelle_month" et "valeur". Et votre SCV n'a pas non plus de champs avec ce nom.


0 commentaires

2
votes

Voici une façon de le faire, vous devez casser les lignes en clé / valeur en utilisant objet.entries () , puis appuyez sur vos nouveaux objets sur des nœuds.

Note Objet.entries ({A: 100}) renvoie un tableau ["a", 100] xxx

éditer: vous pouvez Utilisez également la fonction de réduction qui fonctionne de la même manière xxx


7 commentaires

Cela semble donner une sortie très étrange, pas comme la sortie que j'étais après ex. jsfiddle.net/6vy5w3hp


Oui, cela fonctionne lorsque vous utilisez d3.csvrse (données) non pas avec d3.csvparserows (données) Ce sont deux méthodes différentes.


Ahh, d'accord, je vois maintenant. À travers une autre clé dans les travaux, j'avais juste montré un exemple parce que je ne pouvais pas obtenir un CSV en ligne. Vraiment, j'utilise d3.csv ("certains.csv ') Est-ce que cela fait une différence? Aussi, est-il possible de commander cela par les colonnes, de sorte que tous les this_year viennent d'abord, etc.?


Oui, vous pouvez simplement trier votre graphique.Nodes graphique.nodes.sort (fonction (A, B) {renvoyer A.Name> B.Name? -1: 1}) et si c'est le même avec d3.csv () Mettez votre code à l'intérieur de la fonction d3.csv ("quelque.csv ', fonction (sortie) {// Voici votre code})


Désolé, j'ai un peu perdu sur où mettre la fonction de tri? Cela serait-il en dehors de la boucle?


Une fois que vous avez traité les nœuds, vous pouvez réaffecter graphique.nodes = graphique.nodes.sort (Fonction (A, B) {retour A.Name> B.Name? -1: 1}) < / code>


Merci, j'ai mis à jour mon message pour montrer ce que j'ai. Cependant, cependant, les deux solutions, il trie maintenant les données, mais il montre tous les doublons. Y a-t-il un moyen de les supprimer? Merci



1
votes

La rangée 1 dans votre CSV sont les titres. Cela doit être répété dans l'objet Node en fonction de votre modèle. Vous pouvez y parvenir en bouclant via les titres, puis à l'analyse du reste du fichier CSV:

var d3 = require("d3");
let data = "this_year,minus_one_year,minus_two_year,minus_three_year\n1,2,2,3\n4,5,5,5\n2,2,2,2\n4,5,4,4\n1,2,3,3";

let output = d3.csvParseRows(data);
let nodeTitles = output[0];
let graph = {"nodes" : []};

console.log(nodeTitles);

for (var i = 0; i < nodeTitles.length; i++) {
    for (var j = 1; j < output.length; j++)
    {
        var obj = {name:output[j][i], node:nodeTitles[i]}; 
        if (!graph.nodes.some(function(element) {
            return (element.name == output[j][i]) && (element.node == nodeTitles[i]);
          }))
        {
            graph.nodes.push(obj);
        }
    }
}
console.log(graph);


3 commentaires

Merci, je l'ai testé et ça marche bien. Seul problème est que cela duplique des valeurs pour chaque colonne. Donc l'année_1 ne devrait avoir que 3 nœuds (1, 2 et 4), actuellement 5 par ex. jsfiddle.net/91xrbq6h


@kate_hudson, j'ai édité uniquement d'ajouter des articles uniques au tableau final


Merci beaucoup. Question aléatoire, je viens de découvrir que csvparserows renvoie un tableau car il suppose qu'il n'y a pas d'en-tête. Dans mon code réel, je ne lit pas dans une chaîne, mais un véritable fichier CSV, utilisant donc la fonction CSV de D3, qui analyse des éléments comme objet. Lorsque j'applique ce code à cela, cela ne fonctionne évidemment pas. Savez-vous ce que je devrais faire pour le faire travailler avec un objet? Merci beaucoup