2016-07-04 9 views
0

Ich mag würde eine Textdatei mit Zahlen lesen und sie in einer Matrix mit XMHLHttpRequestXMLHttpRequest: Lesen Sie Textdatei in eine Matrix

ich bereits die FileReader API verwendet haben, aber aus irgendeinem Grund, wenn ich es benutzt, Meine Anwendung hatte einige grafische Fehler.

Meine Idee ist, die Zahlen in die Textdatei zu bekommen und mit Babylon.js zu verwenden, damit ich Punkte in die Leinwand zeichnen kann.

Datei Beispiel:

NUM_GRUPOS 1 
[GRUPO] 
TAM 64 
[PONTOS] 
ROTULO 1 
2.50000000000000E+0002 -2.00000000000000E+0002 2.00000000000000E+0001 0.00000000000000E+0000 0.00000000000000E+0000 1.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 
ROTULO 2 
3.54000000000000E+0002 -2.52000000000000E+0002 3.90000000000000E+0002 1.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 0.00000000000000E+0000 
... //A bunch of other numbers 
[ARESTAS] 
TAM 60 
2.50000000000000E+0002-2.00000000000000E+0002 2.00000000000000E+0001 3.09941176470588E+0002-1.59941176470588E+0002 8.58823529411765E+0001 0.00000000000000E+0000 0.00000000000000E+0000 1.00000000000000E+0000 

Complete example

Ich möchte alle diese ersten Zeilen überspringen und von der [ARESTAS] Stichwort oder TAM Stichwort anfangen zu lesen und setzen die Zahlen in eine Matrix [n] [9], wobei n die Anzahl der Zeilen nach dem Schlüsselwort

012 ist

Die ersten sechs Ziffern a (x, y, z) in der Leinwand, stellt die letzten drei die Objektfarbe

Dies ist, was ich mit dem Filereader tat Koordinate repräsentiert:

var matrix = []; 
var keyWord = '[ARESTAS]'; 
if (window.File && window.FileReader && window.FileList && window.Blob) { 
    function readSingleFile(evt) { 
     var f = evt.target.files[0]; 

     if (f) { 
      var r = new FileReader(); 
      var contents = 'empty'; 
      r.onload = function(e) { 
       contents = e.target.result; 
       var pastKey = false; 
       contents.split('\n').forEach(function(line, i) { 
        if (pastKey) { 
        var vals = line.trim().split(' '); 
        if (vals.length > 2) { 
         matrix.push(vals); 
        } 

        } 
        if (line.trim() === keyWord) { 
        pastKey = true; 
        } 

       }) 
      } 
     r.readAsText(f); 
     } else { 
      alert("Failed"); 
     } 
    } 

    document.getElementById('fileinput').addEventListener('change', readSingleFile, false); 
} else { 
    alert('The File APIs are not fully supported by your browser.'); 
} 

Antwort

0

Warum Iterierte Linien ?

 r.onload = function(e) { 
      contents = e.target.result; 
      var pos = contents.indexOf(keyWord) + keyWord.length; //find [ARESTAS] portion 
      var numbers = contents.substr(pos).trim(); //trim it from rest of file 
      matrix = numbers.split('\n') // get separate lines 
       .map(function (e) { 
        return e.split(' '); // split them by whitespace 
       }) 
       .filter(function (e) { 
        return e.length > 2; // filter all unwanted lines 
       }) 
     } 

... oder auch:

function readMatrix(url, callback) { 
     var xhr = new XMLHttpRequest(); 
     xhr.open("GET", url); 
     xhr.onload = function(e) { 
      var contents = e.target.result; 
      var pos = contents.indexOf(keyWord) + keyWord.length; //find [ARESTAS] portion 

      var matrix = contents 
       .substr(pos) // get arestas section 
       .trim(); //trim redundant whitespace 
       .split('\n') // get separate lines 
       .slice(1) // skip TAM ### line 
       .map(function (e) { 
        return e.split(' '); // split separate lines by whitespace 
       }); // get final matrix 

      callback(matrix); // pass received data to callback 
     } 
     xhr.send(); 
    } 

    document.getElementById('fileinput') 
     .addEventListener('change', function() { 

      var url = ... address of file 

      ... 

      readMatrix(function (matrix) { 

       // we got filled matrix here 

      }); 
     }, false); 
+0

Mein JavaScript Wissen irgendwie schlecht ist. Kann ich Sie bitten, zu erläutern, was genau Sie bei jeder Lösung tun, oder können Sie eine Funktionsdemo bereitstellen? – brunex92

0

Kann dies versuchen, als Startpunkt

var start = contents.indexOf('[ARESTAS]'); 
    // get rid of all before ARESTAS, then split and remove first 2 rows 
    var txtArr = txt.slice(start).split('\r\n').splice(2); 
    //trim and split each line at space and map to array of numbers 
    var numArr = txtArr.reduce(function(a, c){ 
     a.push(c.trim().split(' ').map(Number)) 
     return a 
    },[]) 

DEMO

+0

Das funktioniert ziemlich gut, aber in meinem Fall muss die Textdatei von einer URL oder durch Auswahl der Datei auf dem Computer geladen werden. Nicht aus einer lokalen Datei auf meinem Computer, wenn Sie verstehen, – brunex92

+0

laden Sie die Datei wie Sie wollen .... Ich zeigte, wie man es in Array konvertieren. Aber wenn Sie sich meine Demo ansehen, wird sie auch von der URL geladen (data.txt auf der linken Seite) – charlietfl

+0

Ich habe versucht, den gleichen Code zu verwenden, aber Sie gibt diesen Fehler zurück: Syntaxfehler TestCluster.s3d: 1: 1 Syntax Fehler Index .html: 1: 1 Dieses testcluster.s3d ist meine Textdatei. Wenn ich versuche, das Array auf der Konsole zu zeigen, zeigt es, es ist leer – brunex92