Groups | Search | Server Info | Keyboard shortcuts | Login | Register


Groups > de.comp.lang.javascript > #5163

Re: Semikolons aus Daten entfernen

From Thomas 'PointedEars' Lahn <PointedEars@web.de>
Newsgroups de.comp.lang.javascript
Subject Re: Semikolons aus Daten entfernen
Date 2019-09-26 18:00 +0200
Organization PointedEars Software (PES)
Message-ID <1872806.oMNUckLgyt@PointedEars.de> (permalink)
References <qmi19m$oas$1@news.albasani.net> <qmi834$m79$1@news.albasani.net>

Show all headers | View raw


Wolfgang Wolf wrote:

> Am 26.09.2019 um 11:44 schrieb Wolfgang Wolf:
>> Hallo,
>> 
>> habe folgendes Problem: Möchte aus Daten eine csv-Datei erstellen. Das
>> funktioniert bereits. Leider sind in einigen Attributen Semikolons
>> enthalten, die natürlich die Ausgabe verstümmeln. Ich würde gerne vor
>> dem Export alle Semikolons durch ein anderes Zeichen ersetzen.
> 
> Ok, habe das jetzt erst mal auf die Schnelle so gelöst:
> 
> for (var i = 0; i < data.length; i++) {

Ausser wenn der Wert von “data.length” sich ändern kann, solltest Du den 
Wert nur ein einziges Mal abfragen.

  for (var i = 0, len = data.length; i < len; i++) {

Rückwärts zu iterieren, wenn es auf die Reihenfolge nicht ankommt, ist in 
der Regel effizienter, weil der alte Wert der Iterationsvariablen nicht 
gespeichert werden muss:

  for (var i = data.length; --i;) {

>    for (var prop in data[i]) {

Wenn Du for..in-Schleifen verwendest, dann wird über alle aufzählbaren 
Eigenschaften des Objekts und seiner Prototypen iteriert.  Das solltest Du 
vermeiden, denn Du weisst nie, welche Eigenschaften ein Objekt hat.

Über Array-Objekte wird modern so iteriert:

  data.forEach(callback);

Über die nicht-vererbten aufzählbaren Eigenschaften eines Objekts so:

  Object.keys(obj).forEach(callback);

>      var dProp = data[i][prop];

Da “callback” eine Funktion referenzieren muss, brauchst Du dann auf data[i] 
nicht mehr separat zuzugreifen: der Wert wird als erstes Argument der 
Funktion übergeben und ist somit über den ersten formalen Parameter 
verfügbar.

>      if (typeof dProp == "string") {

Korrekt.  [Ich habe gerade herausgefunden, dass “dProp instanceof String” 
nicht (mehr) funktioniert. “Object(dProp) instanceof String” ginge zwar, 
aber was soll das?  Jetzt kann man nicht (mehr) mit Polymorphie von String 
ableiten :-(  Ist ähnlich idiotisch wie dass “this” bei Arrow Functions 
nicht mehr gesetzt werden kann, so dass der Code unten mit *nur* Arrow 
Functions _nicht_ funktioniert.]

Beachte, dass Duck Typing zwar hier auch möglich ist, aber unerwünschte 
Ergebnisse haben kann, weil alle nativen Objekte die toString-Methode von 
Object.prototype erben.

>        data[i][prop] = dProp.replace(/;/g,",");

Sobald Du auf ein Objekt mehrfach zugreifst (hier: das von data[i] 
referenzierte Objekt) lohnt es sich die Referenz in einer Variable zu 
speichern und dann auf diese Variable zuzugreifen.

>      }
>    }
> }

Zusammenfassend:

  data.forEach(element => {
    Object.keys(element).forEach(function (key) {
      let value = this[key];

      if (typeof value === 'string')
      {
        this[key] = value.replace(/;/g, ',');
      }
    }, element);
  });

Ein Einzeiler kann es also nicht werden, ausser Du magst Spaghetticode oder 
verwendest eine Library.

Ob Du dabei ES 6-Syntax verwendest, ist natürlich Dir überlassen.  Mit 
Präprozessoren wie Babel.js gibt es aber – ausser der Build-Prozess soll
nicht geändert werden – keinen guten Grund mehr, sie nicht zu verwenden.

Bedenke ausserdem, dass es einen guten Grund gibt, weshalb dort Semikolons 
und *nicht* Kommas stehen: In

  "Draht;sw;0,5mm²;40°C...150°C"

sind die Daten eindeutig.  Bei

  "Draht,sw,0,5mm²,40°C...150°C"

(das Ergebnis Deiner Ersetzung) ist das nicht mehr der Fall (ist das Komma 
dort ein Feldtrenner oder ist es ein Dezimalkomma?).  Widrigenfalls müsstest 
Du also zum Beispiel auch das Zahlenformat konvertieren, *bevor* Du den 
Feldtrenner konvertierst – sonst geht Information verloren.

> Bessere Lösungen sind natürlich willkommen.

[x] done

-- 
PointedEars
FAQ: <http://PointedEars.de/faq> | <http://PointedEars.de/es-matrix>
<https://github.com/PointedEars> | <http://PointedEars.de/wsvn/>
Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.

Back to de.comp.lang.javascript | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-09-26 11:44 +0200
  Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-09-26 13:40 +0200
    Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-09-26 18:00 +0200
      Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-09-26 18:09 +0200
      Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-09-28 10:22 +0200
        Re: Semikolons aus Daten entfernen Stefan Mayer <meniskus@gmx.net> - 2019-09-28 14:25 +0200
          Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-10-07 15:59 +0200
            Re: Semikolons aus Daten entfernen Stefan Mayer <meniskus@gmx.net> - 2019-10-08 00:42 +0200
        Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-09-28 17:41 +0200
          Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-10-07 16:06 +0200
            Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-10-10 01:26 +0200
              Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-11-12 16:58 +0100
                Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-11-13 01:04 +0100
                Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-11-14 19:27 +0100
                Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-11-15 12:51 +0100
                Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-11-16 04:22 +0100
                Re: Semikolons aus Daten entfernen Stefan Mayer <meniskus@gmx.net> - 2019-11-16 13:42 +0100
                Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-11-16 14:51 +0100
                Re: Semikolons aus Daten entfernen Stefan Mayer <meniskus@gmx.net> - 2019-11-18 11:56 +0100
                Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-11-18 13:50 +0100
                Re: Semikolons aus Daten entfernen Stefan Mayer <meniskus@gmx.net> - 2019-11-18 15:43 +0100
                Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-11-18 16:40 +0100
                Re: Semikolons aus Daten entfernen Stefan Mayer <meniskus@gmx.net> - 2019-11-18 21:32 +0100
                Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-11-19 07:49 +0100
                Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-11-19 00:03 +0100
                Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-11-19 18:48 +0100
                Re: Semikolons aus Daten entfernen Stefan Mayer <meniskus@gmx.net> - 2019-11-19 19:42 +0100
                Re: Semikolons aus Daten entfernen Stefan Mayer <meniskus@gmx.net> - 2019-11-20 20:31 +0100
                Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-11-16 13:45 +0100
                Re: Semikolons aus Daten entfernen Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2019-11-16 14:57 +0100
                Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-11-18 10:08 +0100
                Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-11-14 11:48 +0100
  Re: Semikolons aus Daten entfernen Claus Reibenstein <4spamersonly@kabelmail.de> - 2019-09-26 14:44 +0200
    Re: Semikolons aus Daten entfernen Wolfgang Wolf <w.wolf@dommel.de> - 2019-09-26 15:57 +0200

csiph-web