Wie kann ich eine txt-Datei über <input> mit JS in eine Liste einlesen?
Ich will eine txt-Datei über:
<input type="file">
mit JavaScript in eine Liste einlesen, ohne sie auf meine Webspace laden zu müssen.
Im Internet habe ich leider nichts gefunden, das mich weitergebracht hat, aber vielleicht könnt ihr mir helfen. Vielen Dank im Vorhinein.
2 Antworten
Habe gerade mal ein wenig herumprobiert. So in etwa sollte es gehen:
html
<input type="file" id="files">
JavaScript
function handleFileSelect(evt) {
var files = evt.target.files;
for (var i = 0, f; (f = files[i]); i++) {
var reader = new FileReader();
reader.onload = (function(theFile) {
return function(e) {
var data = atob(e.target.result.split(",")[1]);
// hier hast du nun Zugriff auf den Datei-Inhalt (data)
};
})(f);
reader.readAsDataURL(f);
}
}
document
.getElementById("files")
.addEventListener("change", handleFileSelect, false);
Ich bräuchte jetzt doch nochmal Hilfe 😬. Ich kann keine einziege String funktion auf data ausführen und auch "toString" hilft mir nicht. Wie kann ich mit der data Variable arbeiten?
Was genau versuchst du denn? Kannst du den Code posten der nicht funktioniert?
Ich habe exakt den Code, den du mir geschickt verwendet und versuche jetzt das ganze in eine Liste umzuwandeln und es aus der Funktion zu bringen.
Was meinst du mit Liste? Ein Array mit den einzelnen Zeilen der Textdatei?
Ich will alle möglichen Daten eines exportierten WhatsApp Chats mit Chart.js grafisch darstellen.
Dann müsstest du ja nur noch die Daten entsprechend aufbereiten und an Chart.js übergeben:
var liste = e.target.result.split("\n");
var config = {
// ... irgendwas mit "liste"
};
var ctx = document.getElementById('dein-canvas').getContext('2d');
var chart = new Chart(ctx, config);
Ja genau, das habe ich schon :). Kannst du mir noch meine letzte Frage zu dem Thema beantworten? Wie kann ich data jetzt aus der Funktion bringen, ich kann ja nicht returnen, oder?
Schreib doch einfach eine renderChart Funktion, die du mit den gewonnenen Daten aufrufst:
function renderChart(data) {
var config = {
// ... irgendwas mit "data"
};
var ctx = document.getElementById('dein-canvas').getContext('2d');
var chart = new Chart(ctx, config);
...
}
function handleFileSelect(evt) {
...
var data = e.target.result.split("\n");
renderChart(data);
...
}
Die Daten direkt returnen kannst du in der Tat nicht, da der FileReader Prozess asynchron läuft. Du könntest lediglich eine Promise verwenden (https://stackoverflow.com/questions/34495796/javascript-promises-with-filereader).
Per AJax/XMLHttpRequest
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if(request.readyState === 4) {
if(request.status === 200) {
console.log(request.responseText);
} else {
console.log("An error occured.");
}
}
}
Ah, es geht auch ohne dass ein explizites Dekodieren notwendig ist (readAsBinaryString anstatt readAsDataURL):