2017-12-28 6 views
0

Ich muss Daten aus einer CSV-Datei in ein JavaScript-Objekt konvertieren, wobei Schlüssel für jedes Objekt die ID aus den Daten ist. Ein JS-Objekt für jeden Benutzer.Schritte zum Erstellen von JavaScript-Objekten aus Textdaten aus einer CSV-Datei ohne Bibliotheken

Frage: Gibt es eine Möglichkeit, es mit Vanille JS zu lösen?

Ich brauche zumindest eine allgemeine Anleitung, was zu tun ist, weil alles, was ich finden konnte, Methoden zur Lösung dieses Problems mit jQuery oder JSON ist, aber für die Forschung, die ich versuche zu verstehen, kann ich ' t ich benutze eine spezialisierte Bibliothek, darf ich nur normales VanillaJS verwenden.

Beispieltextdaten:

id first_name last_name email    gender 
-- ---------- --------- -----    ------ 
1 Gloria  Mendez  [email protected]  Female 
2 Lucy   Grey   [email protected]  Female 
3 Max   Mcolom  [email protected] Male 
4 David   Cooke  [email protected]  Male 
5 Marwin  Darge  [email protected]  Male 

hundreds of other rows 

gewünschter Ausgang:

{ 
    1: { 
    id: 1, first_name: 'Gloria', last_name: 'Mendez', email: '[email protected]', gender: 'female' 
    }, 
    2: { 
    id: 1, first_name: 'Lucy', last_name: 'Grey', email: '[email protected]', gender: 'female' 
    }, 
    ... 
} 
+0

Ist dies auf einer Webseite oder in Knoten? Wie liest du die Datei? Auf jeden Fall sollte es nach der Sortierung ziemlich einfach sein - lese die erste Zeile, teile Leerzeichen auf und du bekommst die Schlüssel - behalte diese dann, wenn du jede folgende Zeile als Werte liest. – vlaz

+0

Vielen Dank für die schnelle Antwort, es ist auf einer Webseite, und für den Lese-Teil, ich spielte mit diesem [code] (https://mounirmesselmeni.github.io/2012/11/20/reading-csv- file-with-javascript-and-html5-file-api /), aber nicht ganz sicher, ob ich es richtig mache, benutze ich ihr fileReader-Objekt (vergib meine Ignoranz, ich bin ein Newby in jS) –

+0

Das ist nicht t eine CSV-Datei. – Dale

Antwort

0

Vanille Verwendung unter JS.

Ich habe Kommentare hinzugefügt, um zu erklären, was der Code macht. Es; s Aufspaltung im Grunde die Daten in Zeilen und Zellen dann, und auf dem Weg Array Manipulation zu tun:

let table = 
 
`id first_name last_name email    gender 
 
-- ---------- --------- -----    ------ 
 
1 Gloria  Mendez  [email protected]  Female 
 
2 Lucy   Grey   [email protected]  Female 
 
3 Max   Mcolom  [email protected] Male 
 
4 David   Cooke  [email protected]  Male 
 
5 Marwin  Darge  [email protected]  Male` 
 

 
// Split into rows, and then split each row into cells 
 
let rows = table.split(/[\r\n]+/g).map(row => row.trim().split(/[\s\t]+/g)); 
 
// The first row will be the header 
 
let header = rows[0]; 
 
// The rest is the data 
 
let data = rows.slice(2); 
 

 

 
// Create a function to return the desired object structure 
 
function formatObject(headers, cells) { 
 
    return headers.reduce((result, header, idx) => { 
 
    result[header] = cells[idx]; 
 
    return result; 
 
    }, {}); 
 
} 
 

 
// Reduce each row into the desired format, and use the ID as a key 
 
let result = data.reduce((res, row, idx) => { 
 
    let value = formatObject(header, row); 
 
    res[value.id] = value; 
 
    return res; 
 
}, {}); 
 

 
// Log the result 
 
console.log(result);

+0

Danke für die Hilfe. Nur eine Sache, liefert der Code, den Sie zur Verfügung gestellt, eine Reihe von Objekten korrekt? Aber was ich brauche, ist ein Objekt, dessen Schlüssel die ID ist und der Wert ist 1 Benutzer. Die "gewünschte Ausgabe" in meiner ursprünglichen Frage, ist, wie sie es wollen. –

+0

Hier gehen Sie, ich habe die Änderung vorgenommen. Versuchen Sie das – user184994

+0

Dies scheint es getan zu haben. Jetzt ist das einzige Problem, zu verstehen, was dein Code macht lol. Danke für die Hilfe! –

0

  • Split auf Zeilenumbruch \n die Datei parsen, um Reihen zu erhalten

const rows = csv.split('\n');

  • Split jede Zeile auf Komma , Zellen zu erhalten (wenn es CSV ist, andernfalls \t für TSV)

const rawData = rows.map(d => d.split(',');

die Header aus der 1. Reihe Auszug

der ersten Zeile der Daten ist die Liste der Schlüssel zum Erstellen von Objekten

const headers = rawData[0]

Convert Zeilen in Objekte

const data = rawData.slice(2); // get rid of first 2 rows 
const output = data.map(row => { 
    const obj = {}; 
    headers.forEach((h, i) => obj[h] = row[i] }); 
    return obj; 
}); 

Natürlich müssen Sie alle Arten von Rand Fälle behandeln, wie Kommas in der Zelle CSV, Daten usw. fehlt ...

Ich hoffe, das Sie bekommt gestartet.

0

Angenommen, Sie laden die Daten bereits, könnten Sie die Daten durchlaufen und die Javascripts-Objektklammernotation verwenden, um die neuen Eigenschaften basierend auf der ID zu definieren.

Wenn Sie Schritt für Schritt suchen,

  1. erste Last der csv etwas wie Knotens fs-Modul oder das Filereader im Browser.
  2. für jede Zeile lesen Sie die CSV mit Javascript-Split zu analysieren.
  3. Wenn die ID immer die erste Spalte ist, können Sie jetzt die ID der Daten mit dem SplitArray [0] erhalten.
  4. Erstellen Sie ein neues Objekt, und verwenden Sie dann Klammern-Notation, um die Eigenschaft des Objekts auf die ID zu setzen. Ex.

    var obj = {}; obj[splitArray[0]] = data;

Das ist wirklich rau, nicht getestet, aber sollten Sie näher kommen, wo Sie gehen müssen.

0

Unter der Annahme einer doppelten Anführungszeichen durch Komma getrennte Datei, die über die am häufigsten csv Format ist:

/* empty lines shown on purpose to approximate real file */ 
 
const csvString = 
 
`"id","first_name","last_name","email","gender" 
 

 
"1","Gloria","Mendez","[email protected]","Female" 
 
"2","Lucy","Grey","[email protected]","Female" 
 
"3","Max","Mcolom","[email protected]","Male" 
 

 
"4","David","Cooke","[email protected]","Male" 
 
"5","Marwin","Darge","[email protected]","Male"`; 
 

 

 
//split string on line breaks into array of line strings 
 
const csvLines=csvString.split('\n'); 
 
// filter empty lines out and map each line to sub array 
 
let arr = csvLines.filter(s=>s.trim()).map(arrFromLine) 
 
// get headings from first line 
 
let headings = arr.shift(); 
 
// map all the other lines into objects 
 
let res = arr.map(lineArr =>{ 
 
    return lineArr.reduce((a,c, i)=>{ 
 
     a[headings[i]] = c; 
 
     return a 
 
    },{}) 
 
}); 
 

 
// map lines to array helper function 
 
function arrFromLine(str){ 
 
    // remove quotes on each end, split at `","` to avoid any other commas in text 
 
    return str.trim().slice(1, str.length-1).split('","');  
 
} 
 

 
console.log(res)
.as-console-wrapper { \t max-height: 100%!important;}

Verwandte Themen