Path: csiph.com!3.eu.feeder.erje.net!feeder.erje.net!weretis.net!feeder7.news.weretis.net!news.mb-net.net!open-news-network.org!.POSTED.166.236.197.178.dynamic.wless.lssmb00p-cgnat.res.cust.swisscom.ch!not-for-mail From: Thomas 'PointedEars' Lahn Newsgroups: de.comp.lang.javascript Subject: Re: Semikolons aus Daten entfernen Date: Thu, 26 Sep 2019 18:00:55 +0200 Organization: PointedEars Software (PES) Lines: 111 Message-ID: <1872806.oMNUckLgyt@PointedEars.de> References: Reply-To: Thomas 'PointedEars' Lahn Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8Bit Injection-Info: gwaiyur.mb-net.net; posting-host="166.236.197.178.dynamic.wless.lssmb00p-cgnat.res.cust.swisscom.ch:178.197.236.166"; logging-data="32008"; mail-complaints-to="abuse@open-news-network.org" User-Agent: KNode/4.14.10 Cancel-Lock: sha1:Zg5zNQb8lUFNNfARXpUJfW2XU5U= X-User-ID: U2FsdGVkX1/Gyyan3FNkevrh3PJe8ztnCzlsvWvffvPX/ZtJOewlGw== Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAGFBMVEXTxa4RFk5dUWANED8PFEfy7+MGBiW+n3ZNF/QuAAACaElEQVQ4jVXUwVOcMBQG8Dc7Rc4PUntdWV2uxjDpGaGeozOp1woar4jd5t/v9wLstMwsA/ntlxdCAgUc1hjTc9/JCZfGoo3wG3HdmdAWrIJRHe7GM/TmpY5VFefuVcAkkPbLIaN8rmPmjloyZxgyR3GuJ4K0AGtJ2htz8o7yqikm759fldQXaMpbDzjKAG+8v+AugVTOPO5DOjLvGtUYQwh0CPjnVMyGd+8/GfUB5nLKJDD2aLDh5HYyMDJGDwQIo2ZmZcKbowNmAdB/AzyFhrmF2MHRb0QJJfaAnwGB6orZhoykLzJtGwF/xpYxI1dswomiUj3gTuAIqCn/4C7cULwGNBtwMTk3Y4LfKB5YUaOKBKYtpplm7u0vip8tU1NWWyI/7XdcSuIDoMt6rVHMWT0DbjHPGqDqZVSa6zleLcUTcIKLoMv3ueJluALtAo9B302zPPlrtiVScRdCjXvVh3e3JpYa/jjkuC9N+LrBMlz/eAN4eQijX2EdLo6c5tGGHwLyHFtXk89dDGHwCVhG9T0S/j55AhRZgkMCmUQXJ49TnS1wnQDvw0eAh9ICeMmEFbCnPMFzjAvsWoEWEFdYEx+S0MoUZ1gT1wId8+AF3Bl2OoEu906AUHx5VLw/gXYg/x84loOah/2UYNrgiwSwGO7RfUzVBbx/kgpckumGOi6QirtD6gkLTitbnxNol47S2jVc2vsN5kPqaAHT8uUdAJM4v/DanjYOwmUjWznGfwB7sGtAtor5BgofDuzaRj4kSQAqDakTsKORa3Q3xKi3gE1fhl71KRMqrdZ2AWNNg/YOhQyrVBnb+i+nEg4bsDA+egAAAABJRU5ErkJggg== X-Face: %i>XG-yXR'\"2P/C_aO%~;2o~?g0pPKmbOw^=NT`tprDEf++D.m7"}HW6.#=U:?2GGctkL,f89@H46O$ASoW&?s}.k+&. 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: | | Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.