TS: dynamisches Einlesen von großer Datenmenge in ein Array o.ä.

Hi zusammen,
ich möchte gerne eine recht große Datenmenge (knapp 1000 Einträge mit jeweils URL & Beschreibung + ein paar Parametern) in eine externe JS-Datei schreiben und diese dann dynamisch als eine Art Tabelle generieren.

Es kommt dabei stark auf die Ladezeiten an. Also soll die Datenmenge möglichst klein sein.
Ich dachte mir deshalb eine Struktur in der externen Datei à la:

|http://www.URL_1.de/|Beschreibung_1|Parameter_1|
|http://www.URL_2.de/|Beschreibung_2|Parameter_2|
.
.
.
|http://www.URL_n.de/|Beschreibung_n|Parameter_n|

Wie kann ich die so abgespeicherten Daten nun dynamisch in ein 3-dimensionales Array (oder in einen anderen Typ, mit dem ich Code erzeugen kann) einlesen? Die genaue Anzahl der Einträge ist bekannt...

Ich weiss, dass ich soetwas schonmal irgendwo gesehen habe, ich kann mich nur nicht mehr erinnern wo. Und Google findet leider nix...

CU & Vielen Dank.
TS

  1. Hallo TS!

    Also ich hatte ein ähnliches Problem und habe es eher unelegant gelöst. Bei mir wird das ganze nicht ausgelesen sondern direkt in dem File in Code gewandelt. Dazu hab ich mir ein dezentes Word Makro geschrieben, was mir einfach aus meinen Einträgen bereits ein Array definiert.

    So wie das bei dir klingt ist das aber eher eine Sache für eine Datenbank. Wenn sich allerdings deine Daten darin nicht sehr häufig ändern und du keine Lust hast auf Datenbankprogrammierung, dann ist vielleicht die Definition eines Arrays in deinem file das beste.
    Allerdings sehe ich nicht wo du da ein 3-D Array brauchen würdest. eine Tabelle mit Spalten und Zeilen ist nur 2D.

    Ich kann dir zur not auch einen kurzen Auszug vom Makro schicken, falls du bedarf hast!?

    mfg
    Martin

    1. Hi,
      das ist nicht mein Problem. Ich habe bereits eine funktionierende Lösung! Es geht um eine sehr große Favoritenstruktur, die als Text exportiert von einem selbstgeschriebenen Delphi-Programm in eine HTML umgewandelt wird, die eine Tabelle erzeugt.
      Allerdings sind die Ladezeiten zu groß geworden und deshalb möchte ich die HTML nicht mehr vom Delphi-Programm erstellen lassen, weil dort der ganze Tabellen-Code unheimlich Speicher frißt!

      Stattdessen soll JS das übernehmen. Und deshalb brauche ich eine Struktur, die mit möglichst wenig Speicherplatzbenutzung die WESENTLICHEN Daten speichert. Nämlich RL, Beschreibung und die Parameter. In meinen Augen muss also ein Trennzeichen zwischen den drei Sachen genüngen. Im obigen Fall das "|".
      Ich muss beim dynamischen Seitenaufbau aber auf die jeweils drei Elemente zugreifen können => daher Array. Wie kann ich nun die Rohdaten in obiger Struktur in ein großes Array einlesen?

      In gewisser Weise ist das natürlich eine Datenbank. Aber halt eine, die Client-seitig aufgebaut werden soll und nicht vom Server um den Speicher zu minimieren...

      Thnx,
      TS

      1. Wie gesagt ich hatte ein ähnliches Problem und konnte leider auch keine elegantere Lösung finden.

        Also sind nicht die Ladezeiten das Problem, sondern der Speicherplatzbedarf auf deinem Server? Das ist dann natürlich was anderes. Allerdings habe ich bisher (auch hier im Forum) keine Möglichkeit gefunden so eine Tabelle sinnvoll aus einem Textfile auszulesen. Jedenfalls nicht wenn man einzelne Zeilen direkt ansprechen möchte. Daher bei mir auch der Umweg über das Array.

        mfg
        Martin

        1. Also sind nicht die Ladezeiten das Problem, sondern der Speicherplatzbedarf auf deinem Server? Das ist dann natürlich was anderes. Allerdings habe ich bisher (auch hier im Forum) keine Möglichkeit gefunden so eine Tabelle sinnvoll aus einem Textfile auszulesen. Jedenfalls nicht wenn man einzelne Zeilen direkt ansprechen möchte. Daher bei mir auch der Umweg über das Array.

          Hi,
          nein, der Speicherplatz ist natürlich nicht das Problem... ;)
          Die paar KBs kann ich grad noch unterbringen. Es geht um die Ladezeiten und die hängen mit dem Speicherplatz unmittelbar zusammen!

          Ich weiss, dass ich das schonmal irgendwo gesehen habe. Vielleicht kennt das ja noch jemand!

          CU & trotzdem Danke...
          TS

          1. Also wenn es um die ladezeiten geht.... also eigentlich liest Javascript Variablen, auch aus externen files, je nach bedarf aus. Das heißt, wenn du das Array auf dem Server in einem File liegen hast, wird das nicht auf einen Schlag ausgelesen, sondern bei jeder Anfrage wird die an den Server geschickt. Ich kann mich dabei aber auch mal wieder irren. So hat mir jedenfalls ein Bekannter den Vorteil dieser Lösung schmackhaft gemacht.

            ___________
            Martin

            1. Was meinst Du mit je nach Bedarf? Die komplette Datei wird bei Anfrage gelesen und im Cache des Browsers gespeichert. Bei der nächsten Anfrage wird die Datei aus dem Cache geholt.

  2. Hi,
    schon mal versucht über XML das Ganze zu lösen?
    http://www.w3schools.com/xml/xml_applications.asp
    http://www.w3schools.com/xml/tryit.asp?filename=cd_navigate

    ...ist natürlich ein bischen Browser abhängig, dafür eine schöne Lösung.

    Grüsse

  3. Hi,

    Dir ist bestimmt klar, dass Du mit Javascript keine Dateiverarbeitung machen kannst. Man kann zwar über einen Umweg Daten in Javascript-Code verpacken und diesen einbinden aber das ist keine Lösung für Dein Problem, da Du mit Javascript keine Datei in ein Array lesen kannst.

    Wenn Dein Webspace Sprachen wie PHP oder Perl unterstützt, warum dann nicht serverseitig lösen, wenigstens die Umwandlung der Datendatei in ein Javascript-Array? Du kannst auch eine Offline-Lösung verwenden, dann kannst Du im Prinzip jede Programmiersprache benutzen.

    Vielleicht habe ich Dich hier auch falsch verstanden und Du willst nur einen Vorschlag für eine optimale Array-Struktur, die Du mit Delphi anlegen willst...

    Für das Array genügen 2 Dimensionen. Ich habe zwar hier keinen fertigen Code parat aber die Struktur müßte etwa so aussehen:

    Array
    (
      0 =>
        Array
        (
          0 => http://www.URL_1.de/
          1 => Beschreibung_1
          2 => Parameter_1
        )
      1 =>
        Array
        (
          0 => http://www.URL_2.de/
          1 => Beschreibung_2
          2 => Parameter_2
        )
    )

    MfG
    Danny

    1. Vielleicht habe ich Dich hier auch falsch verstanden und Du willst nur einen Vorschlag für eine optimale Array-Struktur, die Du mit Delphi anlegen willst...

      Hi,
      so ist es! Die optimale Lösung hat peterS. schon gepostet.

      Vielen Dank trotzdem für dein Bemühen!

      CU,
      TS

  4. gruss TS,

    fuer den grossteil der javascript-objekte wie z.b.
    Object, Array, RegExp, String, Number und Boolean
    ist es moeglich, bei der objekt-definition sowohl
    den objekt-konstruktor als auch das entsprechende
    objekt-literal heranzuziehen - bsp.:

    var x = new Object(); // bzw.: var x = {};
    var x = new Array();  // bzw.: var x = [];
    var regX = /\s+/g;    // bzw.: var regX = new RegExp("\s","g");
    var x = "12345";      // bzw.: var x = new String(12345);
    ...
    ...

    Dein beispiel schreit geradezu nach verwendung von literal-notationen:

    var bookmarks =  { /* schreibweise: Object-literal - als "*.js"-file speichern */

    "Beschreibung_1" : {

    url : "http://www.URL_1.de",
        par : "Parameter_1"
      },

    "Beschreibung_2" : {

    url : "http://www.URL_2.de",
        par : "Parameter_2"
      },

    /*
        ...
      */

    "Beschreibung_N" : {

    url:"http://www.URL_N.de",
        par:"Parameter_N"
      }

    };

    // auszulesen ueber:

    function readStructure() {

    var description, locator, parameter;

    for (description in bookmarks) {

    locator = bookmarks[description].url;
        parameter = bookmarks[description].par;
        /*
          hier mit den daten arbeiten;
        */
      }
    }

    // vorteil  : bleiben die namen der schluessel erhalten,
    //            kann die struktur nachtraeglich ohne
    //            komplikationen geaendert werden;
    //
    // nachteil : die schreibweise eines reinen Array-literals
    //            ist noch kuerzer als die eben im beispiel
    //            verwendete eines Object-literals;

    oder

    var bookmarks = [ /* schreibweise Array-literal - als "*.js"-file speichern */

    ["http://www.URL_1.de","Beschreibung_1","Parameter_1"],
      ["http://www.URL_2.de","Beschreibung_2","Parameter_2"],

    /*
        ...
      */

    ["http://www.URL_N.de","Beschreibung_N","Parameter_N"]

    ];

    // auszulesen ueber:

    function readStructure() {

    var i, loc, des, par;

    for (i=0; i<bookmarks.length; i++) {

    loc = bookmarks[i][0];
        des = bookmarks[i][1];
        par = bookmarks[i][2];
        /*
          hier mit den daten arbeiten;
        */
      }
    }

    // vorteil  : ultrakurze schreibweise einer js-array-struktur;
    //
    // nachteil : aenderungen innerhalb der datenstruktur ziehen
    //            immer eine aenderung des diese strukur lesenden
    //            prozesses nach sich (in diesem bsp. ist der
    //            aufwand zum umschreiben vernachlaessigbar);

    Es kommt dabei stark auf die Ladezeiten an. Also soll die Datenmenge möglichst klein sein.
    Ich dachte mir deshalb eine Struktur in der externen Datei à la:

    |http://www.URL_1.de/|Beschreibung_1|Parameter_1|
    |http://www.URL_2.de/|Beschreibung_2|Parameter_2|
    .
    .
    .
    |http://www.URL_n.de/|Beschreibung_n|Parameter_n|

    nimm die zuletzt vorgeschlagene variante zur loesung Deines problems:

    // "bookmarks.js"
    var bookmarks = [
    ["http://www.URL_1.de","Beschreibung_1","Parameter_1"],
    ["http://www.URL_2.de","Beschreibung_2","Parameter_2"],
    /*
      ...
    */
    ["http://www.URL_N.de","Beschreibung_N","Parameter_N"]];

    die beiden tests, die ich mit jeweils 1000 dieser zeilen

    var bookmarks = [
    ["http://www.URL_1-URL_1-URL_1-URL_1.de","Beschreibung_1,Beschreibung_1,Beschreibung_1,Beschreibung_1","Parameter_1"],
    /* 998 weitere */
    ["http://www.URL_1-URL_1-URL_1-URL_1.de","Beschreibung_1,Beschreibung_1,Beschreibung_1,Beschreibung_1","Parameter_1"]];

    bzw.

    var bookmarks = {
    "Beschreibung_1,Beschreibung_1,Beschreibung_1,Beschreibung_1":{url:"http://www.URL_1-URL_1-URL_1-URL_1.de",par:"Parameter_1"},
    /* 998 weitere */
    "Beschreibung_1,Beschreibung_1,Beschreibung_1,Beschreibung_1":{url:"http://www.URL_1-URL_1-URL_1-URL_1.de",par:"Parameter_1"}];

    durchfuehrte, kommen auf 117.21 kByte fuer die Array-notation bzw. auf 125.02 kByte fuer die Object-notation;

    viel erfolg und by(t)e by(t)e - peterS. - pseliger@gmx.net

    --
    sh:| fo:) ch:? rl:| br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)
    1. var bookmarks = [ /* schreibweise Array-literal - als "*.js"-file speichern */

      ["http://www.URL_1.de","Beschreibung_1","Parameter_1"],
        ["http://www.URL_2.de","Beschreibung_2","Parameter_2"],

      /*
          ...
        */

      ["http://www.URL_N.de","Beschreibung_N","Parameter_N"]

      ];

      // auszulesen ueber:

      function readStructure() {

      var i, loc, des, par;

      for (i=0; i<bookmarks.length; i++) {

      loc = bookmarks[i][0];
          des = bookmarks[i][1];
          par = bookmarks[i][2];
          /*
            hier mit den daten arbeiten;
          */
        }
      }

      // vorteil  : ultrakurze schreibweise einer js-array-struktur;
      //
      // nachteil : aenderungen innerhalb der datenstruktur ziehen
      //            immer eine aenderung des diese strukur lesenden
      //            prozesses nach sich (in diesem bsp. ist der
      //            aufwand zum umschreiben vernachlaessigbar);

      Hi,
      das ist EXAKT die Syntax, die ich gesucht hatte! Vielen Dank!

      Im Grunde hätte mir diese "literal-Schreibweise" schon genügt. Aber vielen Dank für die umfassende Analyse... ;)

      Ich habe schon einiges mit JS gemacht, nur die Syntax ist mir manchmal immernoch etwas fremd.

      CU,
      TS