2017-11-16 2 views
0

Ich habe einen CSV-Parser erstellt und bin in eine interessante Situation geraten. Wenn die onLoad-Funktion gedrückt wird, wird der letzte Schlüssel meines Objekts row doppelt zitiert. Ich suche nach einer Erklärung warum. Weiß jemand?Das dynamische Zuweisen von Objektschlüsseln führt dazu, dass der letzte Schlüssel in doppelten Anführungszeichen enthalten ist.

Kommentare enthält Beispielwerte

const results = []; 
const lines = reader.result.split('\n'); 
//lines = ["accountId,nickname,rando", "test-arn,test-nickname,test-rando"] 
const keys = lines[0].split(','); 
//keys = ["accountId", "nickname", "rando"] 

forEach((line) => { 
    // line = "test-arn, test-nickname, test-rando" 
    const values = line.split(','); 
    // values = ["test-arn", "test-nickname", "test-rando"] 
    const row = {}; 

    for (let i = 0; i < keys.length; i++) { 
     let key = keys[i]; 
     row[key] = values[i]; 
    } 

    //row = { accountId: "test-arn", nickname="test-nickname", "rando": "test-rando"} 
    results.push(row); 
}, lines); 

Sie können sehen, dass der Schlüssel rando innerhalb row durch doppelte Anführungszeichen umgeben ist

row = { 
    accountId: "test-arn", 
    nickname: "test-nickname", 
    "rando": "test-rando", 
} 

Beispiel CSV

accountId,nickname,rando^M 
test-arn,test-nickname,test-rando^M 

Full Function

const parseCsv = ({ file, before, onSuccess, onError }) => { 
    before(); 
    const reader = new FileReader(); 

    reader.readAsText(file); 
    reader.onload =() => { 
     const results = []; 
     const lines = reader.result.split('\n'); 
     const keys = lines[0].split(','); 

     forEach((line) => { 
      const values = line.split(','); 
      const row = {}; 

      for (let i = 0; i < keys.length; i++) { 
       let key = keys[i]; 
       row[key] = values[i]; 
      } 
      results.push(row); 
     }, lines); 

     onSuccess(results); 
    }; 

    reader.onError = (error) => { 
     onError(error); 
    }; 
}; 
+3

und wie die Datei, die Sie aussehen lesen zu entfernen? – caramba

+2

bitte die Datei anhängen – Keerthi

+0

* Sample CSV * Hinzugefügt –

Antwort

0

Ich habe festgestellt, dass es ein Return-Zeichen in den letzten Tasten gelassen zu werden.

in der Konsole:

keys 
>(3) ["accountId", "nickname", "rando"] 
JSON.strigify(keys) 
>"["accountId","nickname","rando\r"]" 

Auflösung ist die Rückkehr Charakter

const results = []; 
const lines = reader.result.split('\n'); 
const header = lines.shift().replace(/(\r\n|\n|\r)/gm, ''); //Remove newline characters 
const keys = header.split(','); 

forEach((line) => { 
    const values = line.replace(/(\r\n|\n|\r)/gm, '').split(','); 
    const row = {}; 

    for (let i = 0; i < keys.length; i++) { 
     row[keys[i]] = values[i]; 
    } 

    results.push(row); 
}, lines); 

onSuccess(results); 
Verwandte Themen