Linuchs: csv-string in Javascript

Moin,

wenn ich per Ajax Adressen von Server hole, erstelle ich per PHP einen csv-String in der Form

$string = "ort_id;land_kz;plz;ort_name\n";
while ( $row = ... ) {
  $string .= $row['id'].";".$row['land_kz'].";".$row['plz'].";".$row['name']."\n";
}
echo $string;

Javascript akzeptiert diesen String mit Zeilenumbrüchen und kann daraus ein Array machen:

arr_ajax_csv  = ajax_getTreffpunkteRequestObj.responseText.split( "\n" );

Nun möchte ich diesen csv-String nicht per Ajax holen, sondern per PHP in eine Javascript-Variable schreiben:

var csv_letzte_orte = "ort_id;land_kz;plz;ort_name
9208;D;64569;Nauheim
13568;D;64521;Berkach
13635;D;64521;Wallerstädten
";

doch das gibt den Fehler

SyntaxError: "" string literal contains an unescaped line break

Klar, der möchte die Zeilen mit einem \ beenden, aber das wäre nicht csv-like.

Wieso mag Javascript den responseText, aber nicht die csv_letzte_orte?

Gruß, Linuchs

  1. Hallo Linuchs,

    Wieso mag Javascript den responseText, aber nicht die csv_letzte_orte?

    Kontext-Wechsel. Du erzeugst JS-Code, der muss sich an die Regeln halten, die für JS-Code gelten. Das heisst halt auch, dass du keine unescapedten Linebreaks erzeugen darfst.

    Wenn ich dir übrigens einen Tip geben darf: nutze lieber JSON.

    $rows = [];
    while($row = $db->fetchAssoc()) {
      $rows[] = $row;
    }
    
    # ...
    
    echo "window.foobar = " . json_encode($rows) . ";";
    

    LG,
    CK

    1. Tach!

      Kontext-Wechsel. Du erzeugst JS-Code, der muss sich an die Regeln halten, die für JS-Code gelten. Das heisst halt auch, dass du keine unescapedten Linebreaks erzeugen darfst.

      Jedenfalls nicht in Strings, die mit "" oder '' eingefasst sind. Mit `` Backticks umrahmte Template Literals hingegen können auch Zeilenumbrüche enthalten, sind aber verhältnismäßig neu und nicht in allen alten Browsern verfügbar.

      Wenn ich dir übrigens einen Tip geben darf: nutze lieber JSON.

      Ja, spart auch das Auseinanderfummeln und Beachten von Sonderregeln, um das/die sich der Parser kümmert.

      dedlfix.

  2. Hallo Linuchs,

    aus PHP heraus einen JavaScript-String zu erzeugen ist eine knifflige Sache, man schlägt sich dann mit den Quirks beider Sprachen herum.

    Ein JSON String macht weniger Kummer, ist aber auch deutlich größer, weil für jede Row die Spaltennamen gespeichert werden. Bei 10 Rows kein Thema, bei 1000 schon eher. Das ist JavaScript, das über die Leitung und durch den Parser muss. Zur Reduktion des Datenvolumns kannst Du mit fetch_row arbeiten, das erzeugt nur numerische Keys und json_encode macht ein Array draus, kein Objekt. Der Code, der das verarbeitet, ist dann schlechter lesbar (weil er auf Spaltennummern statt Spaltennamen zugreift), aber das kann man mittels eines Adapters kapseln.

    Eine andere Möglichkeit kann darin bestehen, einen Nonscript-Scriptblock zu verwenden. Das ist in HTML 5 völlig ok (in HTML 4 nicht). <template> als Container geht nicht, da geht der HTML Parser ran.

    <script id="ortsliste" type="text/csv">
    ort_id;land_kz;plz;ort_name
    208;D;64569;Nauheim
    13568;D;64521;Berkach
    13635;D;64521;Wallerstädten
    </script> 
    

    Diesen Scriptblock kannst Du mit document.getElementById("ortsliste") (oder $("#ortsliste")) lokalisieren und den Textinhalt in einen String holen. Ob Du in deiner DB Ortsnamen hast, die einen Zeilenumbruch oder ein Semikolon enthalten, musst Du selbst wissen. Strings mit Zeilenumbruch drin sind übrigens ein Killer für viele CSV Parser, weil sie zuerst nach Zeilenumbrüchen suchen ohne auf Anführungszeichen zu achten, und dann die Zeilen in Spalten zerlegen.

    Rolf

    --
    sumpsi - posui - clusi
    1. Tach!

      Ein JSON String macht weniger Kummer, ist aber auch deutlich größer, weil für jede Row die Spaltennamen gespeichert werden. Bei 10 Rows kein Thema, bei 1000 schon eher. Das ist JavaScript, das über die Leitung und durch den Parser muss. Zur Reduktion des Datenvolumns kannst Du [...]

      [...] im HTTP Kompression einschalten. Textdaten lassen sich sehr schön komprimieren, besonders solche redundanten. Und die Anwendung bleibt auch frei von Konvertiercode, abgesehen vom JSON-Parser.

      dedlfix.

    2. Ein JSON String macht weniger Kummer, ist aber auch deutlich größer, weil für jede Row die Spaltennamen gespeichert werden. Bei 10 Rows kein Thema, bei 1000 schon eher. Das ist JavaScript, das über die Leitung [...] muss.

      Zumindest das kann man mit serverseitiger Kompression (z.B. gzip) relativ gut wegarbeiten. Für mein Quiz existiert eine JSON-Datei von ~33kB (eingerückt und lesbar) mit etwas über 200 Datensätzen. Diese Datei wird komprimiert mit ca. 8kB übertragen, also ~75% wird vom Kompressionsalgo eingespart.

      1. Hallo kai345,

        das ist aber schön, mal wieder von dir zu lesen. Nach 10 Jahren!

        Bis demnächst
        Matthias

        --
        Pantoffeltierchen haben keine Hobbys.
        ¯\_(ツ)_/¯
        1. das ist aber schön, mal wieder von dir zu lesen. Nach 10 Jahren!

          Vielen Dank. Schön, mal wieder hier zu sein (1).

          Allerdings 10 Jahre waren's dann noch nicht. Letzter Beitrag vom August 2013.

          Jetzt muß ich erst mal die Bedienung/Bedienbarkeit des neuen Forums erlernen, hab da noch diverse Probleme. Wird aber irgendwann.

          Kai

          (1) Hatte mehrer Jahre keine Lust, etwas zu entwickeln oder verbessern, jetzt stehe ich vor einem schier unüberwindbaren Berg, was neue Möglichkeinen von JS/CSS/HTML betrifft ... Lust geht schon wieder flöten.

          1. Hallo kai345,

            Allerdings 10 Jahre waren's dann noch nicht. Letzter Beitrag vom August 2013.

            Hm. Ich sehe den letzten Beitrag von 2008.

            Jetzt muß ich erst mal die Bedienung/Bedienbarkeit des neuen Forums erlernen, hab da noch diverse Probleme. Wird aber irgendwann.

            Gibt bald V5. Aber die Bedienung wird sehr ähnlich bleiben. Für die Hilfe gibts das Fragezeichen oberhalb des Textfeldes.

            (1) Hatte mehrer Jahre keine Lust, etwas zu entwickeln oder verbessern, jetzt stehe ich vor einem schier unüberwindbaren Berg, was neue Möglichkeinen von JS/CSS/HTML betrifft

            Kann aber auch Spaß machen.

            Bis demnächst
            Matthias

            --
            Pantoffeltierchen haben keine Hobbys.
            ¯\_(ツ)_/¯
            1. Allerdings 10 Jahre waren's dann noch nicht. Letzter Beitrag vom August 2013.

              Hm. Ich sehe den letzten Beitrag von 2008.

              Kann ich widerlegen. 😉

              Das Forum bzw. die Datenübernahme ist wohl kapott. Laut Userprofil habe ich nur im Jahr 2007 Beiträge verfasst (419), in Wirklichkeit waren es bis Aug.2013 3135.

              1. Hallo kai345,

                Das Forum bzw. die Datenübernahme ist wohl kapott. Laut Userprofil habe ich nur im Jahr 2007 Beiträge verfasst (419), in Wirklichkeit waren es bis Aug.2013 3135.

                Ja, das hat mich auch gewundert. Es gibt aber zwei verschiedene Nutzer: kai345 und kaichen. Wahrscheinlich hast du dich 2008 neu registriert. Vielleicht gibt es die Möglichkeit, die Nutzerkonten zusammenzuführen. Das weiß aber nur @Christian Kruse.

                Bis demnächst
                Matthias

                --
                Pantoffeltierchen haben keine Hobbys.
                ¯\_(ツ)_/¯
                1. Hallo Matthias,

                  Vielleicht gibt es die Möglichkeit, die Nutzerkonten zusammenzuführen. Das weiß aber nur @Christian Kruse.

                  Was möchtest du wissen? Ob es technisch möglich ist oder ob es eine UI und eine Funktion dafür gibt? 😉

                  Technisch möglich: ja. UI und Funktion: nein.

                  LG,
                  CK

                  1. Hallo Christian Kruse,

                    Was möchtest du wissen? Ob es technisch möglich ist

                    Ja.

                    oder ob es eine UI und eine Funktion dafür gibt? 😉

                    Dass es die im UI nicht gibt, weiß ich.

                    Technisch möglich: ja. UI und Funktion: nein.

                    😀

                    Bis demnächst
                    Matthias

                    --
                    Pantoffeltierchen haben keine Hobbys.
                    ¯\_(ツ)_/¯
                2. Das Forum bzw. die Datenübernahme ist wohl kapott. Laut Userprofil habe ich nur im Jahr 2007 Beiträge verfasst (419), in Wirklichkeit waren es bis Aug.2013 3135.

                  Ja, das hat mich auch gewundert. Es gibt aber zwei verschiedene Nutzer: kai345 und kaichen. Wahrscheinlich hast du dich 2008 neu registriert.

                  Nicht, daß ich wüsste, aber ganz sicher bin ich nicht (das Alter schlägt erbarmungslos zu).

                  Ich vermute ein Problem bezüglich Nutzername/Anmeldename aus dem alten Forum und daß daraus irgendwie zwei Accounts wurden. Jedenfalls habe ich immer nur unter kai345 geschrieben. Ich weiß auch nicht, ob es technisch überhaupt möglich gewesen wäre, kai345 für mehrere Accounts zu nutzen. Mehr als mutmaßen kann ich allerdings nicht; immerhin weiß ich jetzt immerhin, wo ich bezüglich Statistik zu suchen habe, ist ja auch schon was :)

                  Kai

                  1. Hallo kai345,

                    Ich vermute ein Problem bezüglich Nutzername/Anmeldename aus dem alten Forum und daß daraus irgendwie zwei Accounts wurden. Jedenfalls habe ich immer nur unter kai345 geschrieben. Ich weiß auch nicht, ob es technisch überhaupt möglich gewesen wäre, kai345 für mehrere Accounts zu nutzen. Mehr als mutmaßen kann ich allerdings nicht; immerhin weiß ich jetzt immerhin, wo ich bezüglich Statistik zu suchen habe, ist ja auch schon was :)

                    In V3 war der Benutzername (durfte nur Kleinbuchstaben und Zahlen enthalten) nicht zwangsläufig identisch mit dem Namen, der bei den Beiträgen angezeigt wurde. Btw. ich habe dir eine PM geschickt.

                    Bis demnächst
                    Matthias

                    --
                    Pantoffeltierchen haben keine Hobbys.
                    ¯\_(ツ)_/¯
                  2. Hallo kai345,

                    Ich vermute ein Problem bezüglich Nutzername/Anmeldename aus dem alten Forum und daß daraus irgendwie zwei Accounts wurden.

                    Nein. Ein Account ist ein Account geblieben. Da gab es keinen Bug; es gab in V3 allerdings durchaus die Möglichkeit mit zwei User-Accounts unter dem gleichen Namen zu posten.

                    LG,
                    CK

            2. Hallo Matthias,

              Gibt bald V5.

              Noch der Hinweis auf die public Beta 😀

              LG,
              CK