tag:forum.selfhtml.org,2005:/self csv Datei von Duplikaten befreien – SELFHTML-Forum 2020-01-23T10:10:45Z https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763046#m1763046 Pit 2020-01-16T12:00:16Z 2020-01-16T12:00:16Z csv Datei von Duplikaten befreien <p>Hallo,</p> <p>ich will mir gerade eine Funktion schreiben, die eine CSV-Datei von Duplikaten befreit.</p> <p>Die Datei ist wie folgt aufgebaut:</p> <pre><code class="block">Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 ... </code></pre> <p>und kann durchaus sehr groß sein.</p> <p>Deshalb komme ich ein bischen ins Schwimmen beim Bauen der Funktion. Kann man das so anfangen?</p> <pre><code class="block language-php"><span class="token comment">// CSV-Datei auf Unikate bereinigen</span> <span class="token variable">$myCsvArray</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"\n"</span><span class="token punctuation">,</span><span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token variable">$csv_datei</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$myCsvArray</span> <span class="token operator">=</span> <span class="token function">array_unique</span><span class="token punctuation">(</span><span class="token variable">$myCsvArray</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Original löschen</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">file_exists</span><span class="token punctuation">(</span><span class="token variable">$csv_datei</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">unlink</span><span class="token punctuation">(</span><span class="token variable">$csv_datei</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Neue Datei schreiben</span> <span class="token operator">...</span> </code></pre> <p>Und wie schreibe ich die Daten dann am besten wieder in die Datei?</p> <pre><code class="block language-php"><span class="token variable">$datei</span> <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"csv_datei.csv"</span><span class="token punctuation">,</span><span class="token string double-quoted-string">"a"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">fwrite</span><span class="token punctuation">(</span><span class="token variable">$datei</span><span class="token punctuation">,</span> <span class="token operator">??</span><span class="token operator">?</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">fclose</span><span class="token punctuation">(</span><span class="token variable">$datei</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Wer kann mir mal unter die Arme greifen?</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763048#m1763048 Auge 2020-01-16T12:46:03Z 2020-01-16T12:52:20Z csv Datei von Duplikaten befreien <p>Hallo</p> <blockquote> <p>ich will mir gerade eine Funktion schreiben, die eine CSV-Datei von Duplikaten befreit.</p> <p>Kann man das so anfangen?</p> <pre><code class="block language-php"><span class="token comment">// CSV-Datei auf Unikate bereinigen</span> <span class="token variable">$myCsvArray</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"\n"</span><span class="token punctuation">,</span><span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token variable">$csv_datei</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>geht auch in einem Rutsch mit <a href="https://www.php.net/manual/de/function.file.php" rel="nofollow noopener noreferrer">file</a>. Die Funktion liest jede Zeile in ein Array-Element ein.</p> <pre><code class="block language-php"><span class="token comment">// CSV-Datei auf Unikate bereinigen</span> <span class="token variable">$myCsvArray</span> <span class="token operator">=</span> <span class="token function">file</span><span class="token punctuation">(</span><span class="token variable">$csv_datei</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <blockquote> <pre><code class="block language-php"><span class="token variable">$myCsvArray</span> <span class="token operator">=</span> <span class="token function">array_unique</span><span class="token punctuation">(</span><span class="token variable">$myCsvArray</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Das sieht soweit grundsätzlich richtig aus.</p> <blockquote> <pre><code class="block bad language-php"><span class="token comment">// Original löschen</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">file_exists</span><span class="token punctuation">(</span><span class="token variable">$csv_datei</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">unlink</span><span class="token punctuation">(</span><span class="token variable">$csv_datei</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Neue Datei schreiben</span> <span class="token operator">...</span> </code></pre> </blockquote> <p>Du kannst die Datei auch <em>über</em>schreiben. Damit brauchst du diesen Block nimmer mehr.</p> <blockquote> <p>Und wie schreibe ich die Daten dann am besten wieder in die Datei?</p> <pre><code class="block language-php"><span class="token variable">$datei</span> <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"csv_datei.csv"</span><span class="token punctuation">,</span><span class="token string double-quoted-string">"a"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">fwrite</span><span class="token punctuation">(</span><span class="token variable">$datei</span><span class="token punctuation">,</span> <span class="token operator">??</span><span class="token operator">?</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">fclose</span><span class="token punctuation">(</span><span class="token variable">$datei</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Wie oben gesagt, du kannst die Datei auch überschreiben, ohne sie vorher zu löschen. Dazu brauchst du einen anderen Modus zum öffnen der Datei als <code>"a"</code>. Der Modus <code>"w"</code> bietet sich an, da die Datei auf die Länge 0 gebracht wird und der Zeiger/Cursor damit am Anfang der nun leeren Datei gesetzt wird.</p> <p>Aus der <a href="https://www.php.net/manual/de/function.fopen.php" rel="nofollow noopener noreferrer">Doku zu fopen</a> (Abschnitt „mode“ <sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>, Modus <code>"w"</code>): <em>„Nur zum Schreiben geöffnet; platziere Dateizeiger auf Dateianfang und kürze die Datei auf eine Länge von 0. Existiert die Datei nicht, versuche, diese zu erzeugen.“</em></p> <p>Weiterhin musst du dafür sorgen, dass in der Zeit der Schreiboperation niemand anderes auf die Datei zugreifen kann. Das kannst du mit der <a href="https://www.php.net/manual/de/function.flock.php" rel="nofollow noopener noreferrer">Funktion <code>flock</code></a> erreichen.</p> <pre><code class="block language-php"><span class="token variable">$datei</span> <span class="token operator">=</span> <span class="token function">fopen</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"csv_datei.csv"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"w"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">flock</span><span class="token punctuation">(</span><span class="token variable">$datei</span><span class="token punctuation">,</span> <span class="token constant">LOCK_EX</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">fwrite</span><span class="token punctuation">(</span><span class="token variable">$datei</span><span class="token punctuation">,</span> <span class="token function">implode</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"\n"</span><span class="token punctuation">,</span> <span class="token variable">$myCsvArray</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">flock</span><span class="token punctuation">(</span><span class="token variable">$datei</span><span class="token punctuation">,</span> <span class="token constant">LOCK_UN</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">fclose</span><span class="token punctuation">(</span><span class="token variable">$datei</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><strong>[edit]</strong>: Der Volsltändigkeit halber sei hinzugefügt, dass die Alternative zu <code>fopen</code>, <code>flock</code>, <code>fwrite</code> und <code>fclose</code> die Verwendung <a href="https://www.php.net/manual/de/function.file-put-contents.php" rel="nofollow noopener noreferrer">von <code>file_put_contents</code></a> ist, die diesen Block in einer Funktion vereinigt.<strong>[/edit]</strong></p> <p>Also den Inhalt mit <code>file</code> einlesen, ihn mit <code>array_unique</code> behandeln und ihn zu guter Letzt mit dem Block direkt hier drüber <strong>[edit]</strong>(oder mit <code>file_put_contents</code>)<strong>[/edit]</strong> wieder in die Datei schreiben.</p> <p>Tschö, Auge</p> <div class="signature">-- <br> Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.<br> <em>Hohle Köpfe</em> von Terry Pratchett </div> <hr class="footnotes-sep"> <section class="footnotes"> <ol class="footnotes-list"> <li id="fn1" class="footnote-item"><p>Früher™️ gab es für Abschnitte einer PHP-Doku-Seite IDs, auf die man verlinken konnte. Nun nicht mehr. <a href="#fnref1" class="footnote-backref">↩︎</a></p> </li> </ol> </section> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763051#m1763051 MudGuard http://www.andreas-waechter.de/ 2020-01-16T13:14:14Z 2020-01-16T13:14:14Z csv Datei von Duplikaten befreien <p>Hi,</p> <blockquote> <pre><code class="block language-php"><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">file_exists</span><span class="token punctuation">(</span><span class="token variable">$csv_datei</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">unlink</span><span class="token punctuation">(</span><span class="token variable">$csv_datei</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Neue Datei schreiben</span> </code></pre> </blockquote> <p>Gefährlich. Laß irgendwas genau jetzt nach dem Löschen der alten Datei und vor dem (vollständigen) Schreiben der neuen Datei schiefgehen, dann sind die Daten weg.</p> <p>Besser: neue Datei unter anderem Namen schreiben, wenn fertig, alte Datei löschen, neue Datei umbenennen.</p> <p>cu,<br> Andreas a/k/a MudGuard</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763057#m1763057 Raktenwissenschaftler 2020-01-16T14:04:22Z 2020-01-16T14:04:22Z Kommt drauf an... <blockquote> <p>und kann durchaus sehr groß sein.</p> </blockquote> <p>Hm. Wenn ess sich um eine private Anwendung (keine zu veröffentlichende Software) handelt, die Datei durch einen technischen Prozess erzeugt wird und immer einen exakt gleichen Aufbau hat</p> <pre><code class="block good language-txt">Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 </code></pre> <p>also nicht etwa etwas wie</p> <pre><code class="block bad language-txt">Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|"Feld3"|Feld4|Feld5 Feld1|Feld2 |Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 </code></pre> <p>vorkommen kann, und Linux/BSD als OS fest steht, dann (und genau dann) würde ich die Performance messen, mit der PHP oder ein vorheriges <code>sort -u datei</code> (Linux) die doppelten Datensätze ausfiltert.</p> <pre><code class="block language-php"><span class="token variable">$sys</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"sort -u '<span class="token interpolation"><span class="token variable">$csv_datei</span></span>'"</span><span class="token punctuation">;</span> <span class="token variable">$myCsvArray</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"\n"</span><span class="token punctuation">,</span> <span class="token string backtick-quoted-string">`$sys`</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Ansonsten: das von Dir gezeigte array_unique() scheitert ebenso am roten Beispiel wie der Linux/Unix-Befehl sort...</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763058#m1763058 Pit 2020-01-16T14:06:20Z 2020-01-16T14:06:20Z csv Datei von Duplikaten befreien / Neue Frage <p>Hallo nochmal,</p> <p>nachdem das Entfernen von Duplikaten, Triplikaten, Quadrokaten und dergleichen mehr nun wunderbar funktioniert, habe ich festgestellt, dass mein Problem doch etwas tiefgreifender ist:</p> <p>Oft sind es gar keine echten Duplikate, die mich in den csv-Dateien stören. Denn für meine Nöte sind eigendlich nur 2 Felder der csv-Datei zuständig, also hier zum Beispiel Feld2 und Feld3. D.h., wenn Feld2 und Feld3 einer Zeile mit Feld2 und Feld3 einer anderen zeile identisch sind, würde ich gerne beide Datensätze aus der Datei entfernen.</p> <pre><code class="block">Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 ... </code></pre> <p>Gibt es da eine intelligente und performamnte Lösung, ohne alle Datensätze iterieren zu müssen oder falls nicht, wie stellt man sowas dann trotzdem möglichst effizient an?</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763195#m1763195 Felix Riesterer https://felix-riesterer.de 2020-01-19T14:51:13Z 2020-01-19T14:51:13Z Kritik an Deinem Umgang mit Hilfe <p>Lieber Pit,</p> <p>ich habe in diesem Thread genügend gelesen, um Dein Ausgangsposting infrage zu stellen.</p> <blockquote> <p>Die Datei ist wie folgt aufgebaut:</p> <pre><code class="block">Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 ... </code></pre> </blockquote> <p>Nein, das ist sie <a href="https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763137#m1763137" rel="noopener noreferrer">offensichtlich nicht</a>. Das, was Du uns als Vorgabe nennst, trifft in Wirklichkeit auf Dein Problem nicht zu. Damit verurteilst Du diesen Thread zu einer rein akademischen Übung, bei der unsere Antworten auf Dein Problem nur ungenügend passen können, da Du uns die Wahrheit verschweigst. Die sich unter diesen Umständen entwickelnde Diskussionen sind für die beteiligten Hilfswilligen sehr unbefriedigend. Warum nur mutest Du ihnen das zu?</p> <blockquote> <p>Wer kann mir mal unter die Arme greifen?</p> </blockquote> <p>Aber das willst Du doch offensichtlich nicht! Der ganze Thread zeigt, dass Du in Wirklichkeit etwas von Deinem Ursprungsposting abweichendes erreichen willst, für das Du uns aber gezielt wesentliche Informationen vorenthältst. Wenn wir Dir wirklich <em>unter die Arme greifen</em> sollen, müsstest Du uns reinen Wein einschenken. Damit gehst Du aber das Risiko ein, dass man Dir aufzeigt, dass Dein bisheriges Vorgehen <a href="https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763185#m1763185" rel="noopener noreferrer">im Kern dafür ungeeignet</a> ist und eine Neukonzeption nötig hat. Dieses Risiko willst Du aber anscheinend vermeiden, da Du die dafür notwendigen Informationen ja eben zurückhältst.</p> <p>Solltest Du wirklich Hilfe wollen, dann sei ehrlich und nenne alle(!) wesentlichen Fakten. Ansonsten beutest Du unsere Hilfsbereitschaft in einer Weise aus, die unredlich ist.</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763049#m1763049 Pit 2020-01-16T12:53:58Z 2020-01-16T12:53:58Z csv Datei von Duplikaten befreien <p>Hallo Auge,</p> <p>vielen Dank für Deine Unterstützung!</p> <p>Ich kenne file. Ich nutze es nicht, weil mir mal irgendwer (ich glaube sogar, es war hier) gesagt hat, dass file für große Dateien nicht so gut wäre. Ist das so?</p> <p>Perfekt, den w-Modus zu nutzen, das spart den unlink-Schritt tatsächlich.</p> <p>flock ist (in diesem Fall) unnötig, weil nur ich das Script nutze, aber grundsätzlich danke für den Hinweis!</p> <p>Und das zurückschreiben in die Datei über implode ist natürlich genial und ich ärgere mich ein bischen, dass ich da nicht selber drauf gekommen bin.</p> <p>Alles in allem: Vielen Dank für Deine Hilfe!</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763050#m1763050 Der Martin 2020-01-16T13:04:51Z 2020-01-16T13:04:51Z csv Datei von Duplikaten befreien <p>Hallo,</p> <blockquote> <p>Ich kenne file. Ich nutze es nicht, weil mir mal irgendwer (ich glaube sogar, es war hier) gesagt hat, dass file für große Dateien nicht so gut wäre. Ist das so?</p> </blockquote> <p>ich weiß nicht, was der Hintergedanke zu dieser Empfehlung war. Vermutlich der hohe Arbeitsspeicher-Bedarf. Wer immer dir das geraten hat, meinte das wahrscheinlich im Vergleich zum Zeile-für-Zeile-Verarbeiten. Denn sowohl file() als auch file_get_contents() lesen den Dateiinhalt komplett in den Arbeitsspeicher.</p> <blockquote> <p>Und das zurückschreiben in die Datei über implode ist natürlich genial und ich ärgere mich ein bischen, dass ich da nicht selber drauf gekommen bin.</p> </blockquote> <p>Wenn du von der Fraktion "Warum einfach, wenn's auch umständlich geht" bist, kannst du natürlich auch mit einer for- oder foreach-Schleife über dein Array iterieren, jede Zeile einzeln mit fwrite() schreiben und ein "\n" anhängen.<br> (Ironie-Tags bei Bedarf selbst setzen.)</p> <p>Ciao,<br>  Martin</p> <div class="signature">-- <br> Ich stamme aus Ironien, einem Land am sarkastischen Ozean. </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763052#m1763052 Pit 2020-01-16T13:32:31Z 2020-01-16T13:32:31Z csv Datei von Duplikaten befreien <p>Danke für den Hinweis! Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763059#m1763059 Raketenwissenschaftler 2020-01-16T14:13:40Z 2020-01-16T14:13:40Z Kommt drauf an... <p>Vermutlich würde ich sogar zu:</p> <pre><code class="block">$sys = "sort -u 'original.csv' 1>'unique.csv' 2>'logfile.txt'; echo $?"; </code></pre> <p>greifen. Ist nach einem</p> <pre><code class="block language-php"><span class="token variable">$err</span> <span class="token operator">=</span> <span class="token function">intval</span><span class="token punctuation">(</span><span class="token string backtick-quoted-string">`$sys`</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>in $err etwas anderes als 0, dann ging was schief und Du kannst in logfile.txt nachlesen was oder sogar einen Error triggern:</p> <pre><code class="block language-php"><span class="token function">trigger_error</span><span class="token punctuation">(</span> <span class="token function">file_get_contents</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'logfile.txt'</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token constant">E_USER_ERROR</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763060#m1763060 Pit 2020-01-16T14:18:09Z 2020-01-16T14:18:09Z csv Datei von Duplikaten befreien / Neue Frage <blockquote> <p>Gibt es da eine intelligente und performamnte Lösung, ohne alle Datensätze iterieren zu müssen oder falls nicht, wie stellt man sowas dann trotzdem möglichst effizient an?</p> </blockquote> <p>Vor allem, es würde auch ausreichen, das Ganze per mysql zu machen, da ich die erzeugte Datei in mysql importiere.</p> <p>Das heißt also, wenn ich eine Query hätte, die anhand zweier Spalten feststellt, dass der Eintrag (in für mich relevanten Spalten) gleich ist und beide entfernt, wäre mir auch gedient.</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763062#m1763062 Raketenwissenschaftler 2020-01-16T14:19:38Z 2020-01-16T14:19:38Z csv Datei von Duplikaten befreien / Neue Frage <p>Sowas?</p> <pre><code class="block">Felds|Feld2|Feld3|Feldv|Feldg Feldg|Feld2|Feld3|Feldc|Feldk </code></pre> <p>Shell-Variante:</p> <pre><code class="block language-bash"><span class="token function">sort</span> <span class="token parameter variable">-u</span> -t<span class="token string">'|'</span> <span class="token parameter variable">-k</span> <span class="token number">2,3</span> <span class="token operator"><</span> original.csv <span class="token operator">></span> unique.csv </code></pre> <p>Ergebnis:</p> <pre><code class="block">Felds|Feld2|Feld3|Feldv|Feldg </code></pre> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763082#m1763082 Felix Riesterer https://felix-riesterer.de 2020-01-16T19:15:06Z 2020-01-16T19:15:06Z csv Datei von Duplikaten befreien / Neue Frage <p>Lieber Pit,</p> <blockquote> <p>Oft sind es gar keine echten Duplikate, die mich in den csv-Dateien stören. Denn für meine Nöte sind eigendlich nur 2 Felder der csv-Datei zuständig, also hier zum Beispiel Feld2 und Feld3.</p> </blockquote> <p>dann bietet sich ein assoziatives Array an, bei dem der Index aus den Werten der Felder 2 und 3 zusammengesetzt ist. Sollte es also mehrfache Kombinationen derselben Werte geben, wird der Array-Eintrag jedes Mal überschrieben, wenn er schon existieren sollte. Damit ist sichergestellt, dass er nur einmal vorkommt:</p> <pre><code class="block language-php"><span class="token variable">$unique</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$zeile</span> <span class="token keyword">as</span> <span class="token variable">$felder</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Feld2 entspricht $felder[1] und Feld3 $felder[2]</span> <span class="token variable">$key</span> <span class="token operator">=</span> <span class="token function">sprintf</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'%s_%s'</span><span class="token punctuation">,</span> <span class="token variable">$felder</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token variable">$felder</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$unique</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'Feld2'</span> <span class="token operator">=></span> <span class="token variable">$felder</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Feld3'</span> <span class="token operator">=></span> <span class="token variable">$felder</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Liebe Grüße</p> <p>Felix Riesterer</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763112#m1763112 pl 2020-01-17T11:42:13Z 2020-01-17T11:42:13Z csv Datei von Duplikaten befreien / Neue Frage <p>Beide Probleme kannst Du über assoziative Arrays lösen. Mache aus jeder Zeile ein assiatives Array, also so daß die Spalten Namen bekommen. Dann kannst Du über array_merge() diese Felder namentlich überschreiben.</p> <p>Und die ganze Datei ist auch ein ass. Array. Entweder mit der Zeilennummer als Schlüssel oder mit einem Datenfeld was die Eindeutigkeit regelt.</p> <p>MFG</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763063#m1763063 Raketenwissenschaftler 2020-01-16T14:24:12Z 2020-01-16T14:24:12Z csv Datei von Duplikaten befreien / Neue Frage <blockquote> <p>Das heißt also, wenn ich eine Query hätte</p> </blockquote> <p>Du kannst in der Tabellendefinition einen Unique-Index über die beiden Spalten setzen. Falls diese beiden Spalten nur pro Import "unique" sein müssen, dann nimm eine temporäre Tabelle und schreibe deren Inhalt in einem zweiten Schritt in die eigentliche Tabelle.</p> <p>Aber eigentlich würde ich wohl zu <code>sort</code> greifen. Frage: Was meinst Du mit "große Datei"?</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763064#m1763064 Pit 2020-01-16T14:29:53Z 2020-01-16T14:29:53Z csv Datei von Duplikaten befreien / Neue Frage <p>Hallo Raketenwissenschaftler,</p> <blockquote> <p>Shell-Variante:</p> <pre><code class="block language-bash"><span class="token function">sort</span> <span class="token parameter variable">-u</span> -t<span class="token string">'|'</span> <span class="token parameter variable">-k</span> <span class="token number">2,3</span> <span class="token operator"><</span> original.csv <span class="token operator">></span> unique.csv </code></pre> </blockquote> <p>Danke dafür, aber eine Shell-Variante komt eher nicht in Frage. </p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763065#m1763065 Raketenwissenschaftler 2020-01-16T14:31:48Z 2020-01-16T14:31:48Z csv Datei von Duplikaten befreien / Neue Frage <p>Und wenn wir schon dabei sind, kannst Du Dir auch den Umweg über PHP ganz sparen:</p> <p>Die <a href="https://dev.mysql.com/doc/refman/8.0/en/mysqlimport.html" rel="nofollow noopener noreferrer">Hilfe zu mysql_import()</a> sagt:</p> <pre><code class="block">--fields-enclosed-by This option has the same meaning as the corresponding clause for LOAD DATA --fields-escaped-by This option has the same meaning as the corresponding clause for LOAD DATA --fields-optionally-enclosed-by This option has the same meaning as the corresponding clause for LOAD DATA --fields-terminated-by This option has the same meaning as the corresponding clause for LOAD DATA --force Continue even if an SQL error occurs </code></pre> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763067#m1763067 Raketenwissenschaftler 2020-01-16T14:51:45Z 2020-01-16T14:51:45Z csv Datei von Duplikaten befreien / Neue Frage <p>Und wenn wir schon dabei sind:</p> <p>Statt die Datei via PHP Zeile für Zeile und Wert für Wert in die Datenbank-Tabelle mit dem Unique-Index zu "schubsen" kannst Du auch innerhalb von PHP und einer bestehenden MYSQL-Verbindung zum</p> <p><a href="https://dev.mysql.com/doc/refman/8.0/en/load-data.html" rel="nofollow noopener noreferrer">LOAD DATA INFILE</a></p> <p>Statement greifen. Allerdings solltest Du dann <a href="https://dev.mysql.com/doc/refman/8.0/en/load-data.html#load-data-input-file" rel="nofollow noopener noreferrer">auch hier lesen</a>.</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763070#m1763070 Tabellenkalk 2020-01-16T16:12:30Z 2020-01-16T16:12:30Z csv Datei von Duplikaten befreien / Neue Frage <p>Hallo,</p> <blockquote> <p>Unique-Index</p> </blockquote> <p>Das Löschen beider Datensätze, wenn 2 Felder identisch sind, ist eher ungewöhnlich. Es würde mich überraschen, wenn Datenbanken eine out-of-the-box-Lösung hätten.</p> <p>Möglicherweise gehts mit einem Trigger, der im Fall, dass der Unique-Index aktiv werden muss, einen Marker setzt. Anschließend dann markierte Datensätze löschen. Aber wie so eine Trigger aussehen muss, weiß ich auch nicht…</p> <p>Gruß<br> Kalk</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763071#m1763071 Rolf B 2020-01-16T16:31:02Z 2020-01-16T16:31:02Z csv Datei von Duplikaten befreien / Neue Frage <p>Hallo Raketenwissenschaftler,</p> <blockquote> <p>Du kannst in der Tabellendefinition einen Unique-Index über die beiden Spalten setzen.</p> </blockquote> <p>Das hilft nicht, wenn die Daten Duplicates enthalten. Dann bricht der Import ab. Glaube ich...</p> <p>TIL<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> : row-value-expressions.</p> <p>Und damit wäre mein Ansatz dieser: eine Work-Table mit einen NON-UNIQUE Index, so dass Duplicates erstmal kein Problem sind, aber ein GROUP BY effizient via Index möglich ist. Und dann die Duplikate ausblenden. Das geht mit row-value-expressions und NOT IN.</p> <p>Angenommen, die Tabelle, in die der wirkliche Import stattfinden soll, hieße <code>real_table</code>. Dann gelingt es mit folgender Magie:</p> <pre><code class="block language-sql"><span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> real_table <span class="token punctuation">(</span>feld1<span class="token punctuation">,</span> feld2<span class="token punctuation">,</span> feld3<span class="token punctuation">,</span> feld4<span class="token punctuation">,</span> feld5<span class="token punctuation">,</span> feld6<span class="token punctuation">)</span> <span class="token keyword">SELECT</span> feld1<span class="token punctuation">,</span> feld2<span class="token punctuation">,</span> feld3<span class="token punctuation">,</span> feld4<span class="token punctuation">,</span> feld5<span class="token punctuation">,</span> feld6 <span class="token keyword">FROM</span> temp_table <span class="token keyword">WHERE</span> <span class="token punctuation">(</span>feld2<span class="token punctuation">,</span> feld3<span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token operator">IN</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> feld2<span class="token punctuation">,</span> feld3 <span class="token keyword">FROM</span> temp_table <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> feld2<span class="token punctuation">,</span> feld3 <span class="token keyword">HAVING</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">)</span> </code></pre> <p>(feld2, feld3) ist eine <strong>row-value-expression</strong>. Sowas kannte ich bisher nur vom DB2 unseres Großrechners, und hielt es für eine nützliche, aber ansonsten unbekannte IBM Erweiterung. Weit gefehlt, das ist SQL-92 und es funktioniert z.B. auch in MYSQL 5.6.</p> <p>Soviel zu meiner Hypothese, dass man den IN Operator nur für Skalare einsetzen könnte.</p> <p>Ich dachte kurz, man könnte das auch mit einem JOIN nachbilden, aber das führt (logischerweise) bei N Duplicates zu einer Ver-N-fachung der eindeutigen Sätze. Man müsste also noch einen DISTINCT nachschalten. Ich glaube nicht, dass das effizient ist.</p> <p>Was übrigens nicht geht, ist ein Vorfiltern der Duplikate auf diese Weise:</p> <pre><code class="block bad language-sql"><span class="token keyword">DELETE</span> <span class="token keyword">FROM</span> temp_table <span class="token keyword">WHERE</span> <span class="token punctuation">(</span>feld2<span class="token punctuation">,</span> feld3<span class="token punctuation">)</span> <span class="token operator">IN</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> feld2<span class="token punctuation">,</span> feld3 <span class="token keyword">FROM</span> temp_table <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> feld2<span class="token punctuation">,</span> feld3 <span class="token keyword">HAVING</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">)</span> </code></pre> <p>Grund: Ich darf in der WHERE Klausel eines DELETE nicht die Tabelle verwenden, aus der gelöscht wird. Wenn man die Duplikatsätze löschen will, müsste man eine Zwischentabelle haben, in der man die (feld2, feld3) Paare speichert, die zu löschen sind.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> <hr class="footnotes-sep"> <section class="footnotes"> <ol class="footnotes-list"> <li id="fn1" class="footnote-item"><p>Today I Learned <a href="#fnref1" class="footnote-backref">↩︎</a></p> </li> </ol> </section> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763066#m1763066 Raketenwissenschaftler 2020-01-16T14:38:57Z 2020-01-16T14:38:57Z csv Datei von Duplikaten befreien / Neue Frage <blockquote> <p>Danke dafür, aber eine Shell-Variante komt eher nicht in Frage</p> </blockquote> <p>Wenn es sich wirklich um große Datenmengen handelt dann sollte statt "eher nicht" ein guter Grund da stehen.</p> <p>Du kannst das Shell-Zeug auch in ein Skript schreiben, dieses dann in PHP kapseln (eg. "deinskript.sh"), die Fehlerausgaben darin mit 2>logfile umleiten und die Exit-Codes jeweils aus $? auslesen...</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763072#m1763072 Raketenwissenschaftler 2020-01-16T16:38:12Z 2020-01-16T16:38:12Z csv Datei von Duplikaten befreien / Neue Frage <blockquote> <blockquote> <p>Du kannst in der Tabellendefinition einen Unique-Index über die beiden Spalten setzen.</p> </blockquote> </blockquote> <blockquote> <p>Das hilft nicht, wenn die Daten Duplicates enthalten. Dann bricht der Import ab. Glaube ich...</p> </blockquote> <p><a href="https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763065#m1763065" rel="noopener noreferrer">Man muss da nicht unbedingt erwas glauben, denn es kommt drauf an, wie man den Import macht</a>...</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763074#m1763074 Pit 2020-01-16T16:54:04Z 2020-01-16T16:54:04Z csv Datei von Duplikaten befreien / Neue Frage <p>Hallo Rolf,</p> <blockquote> <p>Und damit wäre mein Ansatz dieser: eine Work-Table mit einen NON-UNIQUE Index, so dass Duplicates erstmal kein Problem sind, aber ein GROUP BY effizient via Index möglich ist. Und dann die Duplikate ausblenden. Das geht mit row-value-expressions und NOT IN.</p> </blockquote> <p>Haha...diese Tabelle existiert bereits Es ist tatsächlich so, dass ich eine temp_table habe, die ohne Unique-Index (mal vom Primary-Key abgesehen) läuft und aus der ohnehin die Daten 1:1 in die real_table-Tabelle kopiert werden sollen. Und genau das scheitert, wenn Feld2+Feld3 zweier Datensätze identisch sind, weil ich einen kombinierten Unique-Index auf Feld2+Feld3 liegen habe.</p> <blockquote> <p>Angenommen, die Tabelle, in die der wirkliche Import stattfinden soll, hieße <code>real_table</code>. Dann gelingt es mit folgender Magie:</p> <pre><code class="block language-sql"><span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> real_table <span class="token punctuation">(</span>feld1<span class="token punctuation">,</span> feld2<span class="token punctuation">,</span> feld3<span class="token punctuation">,</span> feld4<span class="token punctuation">,</span> feld5<span class="token punctuation">,</span> feld6<span class="token punctuation">)</span> <span class="token keyword">SELECT</span> feld1<span class="token punctuation">,</span> feld2<span class="token punctuation">,</span> feld3<span class="token punctuation">,</span> feld4<span class="token punctuation">,</span> feld5<span class="token punctuation">,</span> feld6 <span class="token keyword">FROM</span> temp_table <span class="token keyword">WHERE</span> <span class="token punctuation">(</span>feld2<span class="token punctuation">,</span> feld3<span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token operator">IN</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> feld2<span class="token punctuation">,</span> feld3 <span class="token keyword">FROM</span> temp_table <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> feld2<span class="token punctuation">,</span> feld3 <span class="token keyword">HAVING</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">)</span> </code></pre> <p>(feld2, feld3) ist eine <strong>row-value-expression</strong>. Sowas kannte ich bisher nur vom DB2 unseres Großrechners, und hielt es für eine nützliche, aber ansonsten unbekannte IBM Erweiterung. Weit gefehlt, das ist SQL-92 und es funktioniert z.B. auch in MYSQL 5.6.</p> </blockquote> <p>Das muß ich unbedingt ausprobieren... hört sich zu schön an, um wahr zu sein </p> <blockquote> <p>Soviel zu meiner Hypothese, dass man den IN Operator nur für Skalare einsetzen könnte.</p> <p>Ich dachte kurz, man könnte das auch mit einem JOIN nachbilden, aber das führt (logischerweise) bei N Duplicates zu einer Ver-N-fachung der eindeutigen Sätze. Man müsste also noch einen DISTINCT nachschalten. Ich glaube nicht, dass das effizient ist.</p> <p>Was übrigens nicht geht, ist ein Vorfiltern der Duplikate auf diese Weise:</p> <pre><code class="block bad language-sql"><span class="token keyword">DELETE</span> <span class="token keyword">FROM</span> temp_table <span class="token keyword">WHERE</span> <span class="token punctuation">(</span>feld2<span class="token punctuation">,</span> feld3<span class="token punctuation">)</span> <span class="token operator">IN</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> feld2<span class="token punctuation">,</span> feld3 <span class="token keyword">FROM</span> temp_table <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> feld2<span class="token punctuation">,</span> feld3 <span class="token keyword">HAVING</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">)</span> </code></pre> <p>Grund: Ich darf in der WHERE Klausel eines DELETE nicht die Tabelle verwenden, aus der gelöscht wird. Wenn man die Duplikatsätze löschen will, müsste man eine Zwischentabelle haben, in der man die (feld2, feld3) Paare speichert, die zu löschen sind.</p> </blockquote> <p>Schade, aber einleuchtend. Aber wenn obige Query läuft (ich kanns erst morgen früh probieren), wäre ich sehr zufrieden.</p> <p>Auf jeden Fall Danke für den Tip!</p> <blockquote></blockquote> <p>...der war gut </p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763083#m1763083 Rolf B 2020-01-16T19:33:50Z 2020-01-16T19:33:50Z csv Datei von Duplikaten befreien / Neue Frage <p>Hallo Pit,</p> <blockquote> <p>Und genau das scheitert, wenn Feld2+Feld3 zweier Datensätze identisch sind, weil ich einen kombinierten Unique-Index auf Feld2+Feld3 liegen habe</p> </blockquote> <p>Dann mach ihn doch Non Unique</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763085#m1763085 Pit 2020-01-16T21:21:02Z 2020-01-16T21:21:02Z csv Datei von Duplikaten befreien / Neue Frage <p>Hallo Felix,</p> <blockquote> <p>dann bietet sich ein assoziatives Array an, bei dem der Index aus den Werten der Felder 2 und 3 zusammengesetzt ist. Sollte es also mehrfache Kombinationen derselben Werte geben, wird der Array-Eintrag jedes Mal überschrieben, wenn er schon existieren sollte. Damit ist sichergestellt, dass er nur einmal vorkommt:</p> </blockquote> <p>Ja, würde gehen. Entspricht dann aber nicht mehr ganz meinem Vorhaben, beide Einträge heraus zu werfen, der erste würde immer "gewinnen" und bleiben.</p> <p>Gruß und danke für die Idee,</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763084#m1763084 Pit 2020-01-16T21:04:11Z 2020-01-16T21:04:11Z csv Datei von Duplikaten befreien / Neue Frage <blockquote> <p>Hallo Pit,</p> <blockquote> <p>Und genau das scheitert, wenn Feld2+Feld3 zweier Datensätze identisch sind, weil ich einen kombinierten Unique-Index auf Feld2+Feld3 liegen habe</p> </blockquote> <p>Dann mach ihn doch Non Unique</p> </blockquote> <p>Hallo Rolf,</p> <p>um Himmels Willen - nein. Es hat ja seinen grund, warum ich den Index gesetzt habe. Hintergrund ist, dass "in Echt" die Kombination aus Feld2 und Feld3 ein Produkt beschreibt, das eben tatsächlich "unique" ist. Trotzdem möchten dies sowohl User als auch meine Importlisten falscherweise unterlaufen. Das fange ich dann über einen Error 1062 ab. Insofern habe ich auch gar keine Hemmungen, beim Listenimport beide Zeilen heraus zu werfen, denn ich kann unmöglich wissen, welche der beiden hzeilen eigentlich die Korrekte wäre. Dies zu erruieren, wäre aber unwirtschaftlich, daher müssen beide (leider) raus.</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763089#m1763089 Rolf B 2020-01-16T23:12:45Z 2020-01-16T23:12:45Z csv Datei von Duplikaten befreien / Neue Frage <p>Hallo Pit,</p> <blockquote> <p>um Himmels Willen</p> </blockquote> <p>Aber Herr Wöller!</p> <p>Du schreibst, die Daten würden aus der Temp-Table 1:1 in die Real-Table übertragen. Mutmaßlich also mit einem INSERT. Und ich hatte dargestellt, wie Du bei diesem INSERT die Sätze ausblenden kannst, bei denen feld2+feld3 ein Duplikat enthalten. Reicht das nicht?</p> <p>Wenn's mehr als ein INSERT ist - was ist es dann?</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763086#m1763086 Tabellenkalk 2020-01-16T22:28:11Z 2020-01-16T22:28:11Z csv Datei von Duplikaten befreien / Neue Frage <p>Hallo,</p> <blockquote> <p>Entspricht dann aber nicht mehr ganz meinem Vorhaben, beide Einträge heraus zu werfen, der erste würde immer "gewinnen" und bleiben.</p> </blockquote> <p>Nicht wenn du da ein</p> <pre><code class="block language-pseudocode">If (isset) unset </code></pre> <p>unterbringen kannst</p> <p>Gruß<br> Kalk</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763091#m1763091 Felix Riesterer https://felix-riesterer.de 2020-01-17T00:05:33Z 2020-01-17T00:05:33Z csv Datei von Duplikaten befreien / Neue Frage <p>Lieber Pit,</p> <blockquote> <p>Ja, würde gehen. Entspricht dann aber nicht mehr ganz meinem Vorhaben, beide Einträge heraus zu werfen, der erste würde immer "gewinnen" und bleiben.</p> </blockquote> <p>nein, der letzte würde "gewinnen" und bleiben.</p> <p>Inwiefern verstehe ich Dich falsch? Willst Du bei Duplikaten bzw. Mehrfachvorkommen überhaupt keinen Eintrag davon mehr haben? Das ginge dann so:</p> <pre><code class="block language-php"><span class="token variable">$unique</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$zeile</span> <span class="token keyword">as</span> <span class="token variable">$felder</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Feld2 entspricht $felder[1] und Feld3 $felder[2]</span> <span class="token variable">$key</span> <span class="token operator">=</span> <span class="token function">sprintf</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'%s_%s'</span><span class="token punctuation">,</span> <span class="token variable">$felder</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token variable">$felder</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">array_key_exists</span><span class="token punctuation">(</span><span class="token variable">$key</span><span class="token punctuation">,</span> <span class="token variable">$unique</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// zum Löschen markieren</span> <span class="token variable">$unique</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'delete'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment">// neuen Eintrag anlegen</span> <span class="token variable">$unique</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'Feld2'</span> <span class="token operator">=></span> <span class="token variable">$felder</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Feld3'</span> <span class="token operator">=></span> <span class="token variable">$felder</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// clean up</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token function">array_keys</span><span class="token punctuation">(</span><span class="token variable">$unique</span><span class="token punctuation">)</span> <span class="token keyword">as</span> <span class="token variable">$key</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">array_key_exists</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'delete'</span><span class="token punctuation">,</span> <span class="token variable">$unique</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">unset</span> <span class="token punctuation">(</span><span class="token variable">$unique</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>Liebe Grüße</p> <p>Felix Riesterer</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763113#m1763113 Raketenwissenschaftler 2020-01-17T12:38:36Z 2020-01-17T12:38:36Z csv Datei von Duplikaten befreien / Neue Frage <blockquote> <p>Entspricht dann aber nicht mehr ganz meinem Vorhaben</p> </blockquote> <p>Ich bin aber schon ein wenig "angefressen" weil Du Dein Vorhaben nicht gleich richtig beschreibst sondern erst nach dem Vorstellen von Lösungsmöglichkeiten schrittweise mit "Aber ich will …" nachträgst. Und zwar jeden Punkt schön einzeln.</p> <p>Das Vorhaben von Anfang an richtig und umfassend zu beschreiben (z.B. mit "Programmablaufplan") führt zielgerichtet zu richtigen und Dir nützenden Antworten.</p> <p>So wie Du Dein Vorhaben beschreibst bekommst Du viele Antworten, die zwar richtig sind, Dir aber nichts nützen.</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763093#m1763093 Pit 2020-01-17T01:20:43Z 2020-01-17T01:20:43Z csv Datei von Duplikaten befreien / Neue Frage <p>Hallo Rolf,</p> <blockquote> <p>Du schreibst, die Daten würden aus der Temp-Table 1:1 in die Real-Table übertragen. Mutmaßlich also mit einem INSERT. Und ich hatte dargestellt, wie Du bei diesem INSERT die Sätze ausblenden kannst, bei denen feld2+feld3 ein Duplikat enthalten. Reicht das nicht?</p> </blockquote> <p>Doch klar. Ich hatte nur noch nicht die Zeit (bzw. den Rechner), es einzubauen und zu prüfen. Wenn das läuft, ist Deine Lösung ein Traum </p> <p>Morgen früh bin ich schlauer, ich melde mich ;-)</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763104#m1763104 Pit 2020-01-17T09:46:15Z 2020-01-17T09:46:15Z csv Datei von Duplikaten befreien / Neue Frage <p>Hallo Felix,</p> <p>vielen lieben Dank für Deine Lösung und Hilfe!</p> <p>Ich habe mir Deinen Lösungsweg auf jeden Fall gespeichert, nehme aber die <a href="https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763071#m1763071" rel="noopener noreferrer">SQL-Lösung von Rolf</a>, weil sie zum einen die einzelnen Datensätze nicht iterieren muß und zum anderen haargenau in meinen eh schon vorhandenen Importweg passt (temp-table und von dort aus in real_table).</p> <p>Trotzdem vielen Dank für Deinen Weg über php.</p> <p>Gruß, Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763095#m1763095 Rolf B 2020-01-17T07:47:58Z 2020-01-17T07:47:58Z csv Datei von Duplikaten befreien / Neue Frage <p>Hallo Pit,</p> <blockquote> <p>Wenn das läuft, ist Deine Lösung ein Traum</p> </blockquote> <p><a href="https://de.wikipedia.org/wiki/Albtraum" rel="nofollow noopener noreferrer">Freut mich </a></p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763096#m1763096 Pit 2020-01-17T07:49:37Z 2020-01-17T07:49:37Z csv Datei von Duplikaten befreien / Neue Frage <blockquote> <p>Hallo Pit,</p> <blockquote> <p>Wenn das läuft, ist Deine Lösung ein Traum</p> </blockquote> <p><a href="https://de.wikipedia.org/wiki/Albtraum" rel="nofollow noopener noreferrer">Freut mich </a></p> </blockquote> <p>Hi Rolf,</p> <p>hm...versteh ich jetzt nicht ganz...mach mich mal schlau, ok?</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763097#m1763097 Rolf B 2020-01-17T07:51:31Z 2020-01-17T07:51:31Z csv Datei von Duplikaten befreien / Neue Frage <p>Hallo Pit,</p> <p>das war mein Versuch, einen Scherz zu machen. Wenn jemand etwas als "einen Traum" bezeichnet, könnte es sich ja auch als Alptraum herausstellen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763099#m1763099 Pit 2020-01-17T07:55:50Z 2020-01-17T07:55:50Z csv Datei von Duplikaten befreien / Neue Frage <blockquote> <p>Hallo Pit,</p> <p>das war mein Versuch, einen Scherz zu machen. Wenn jemand etwas als "einen Traum" bezeichnet, könnte es sich ja auch als Alptraum herausstellen.</p> </blockquote> <p>Hallo Rolf,</p> <p><em>lol</em>, Deine Erklärung dazu ist witziger als Dein Scherzversuch </p> <p>Nichts für Ungut </p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763102#m1763102 Pit 2020-01-17T09:30:52Z 2020-01-17T09:30:52Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Rolf,</p> <p>nach ausführlichen Tests muß ich sagen, Deine Lösung funktioniert allerbestens! Finde ich ganz hervorragend! Danke!!!</p> <p>Eine Zusatzfrage: Wenn ich mal irgendwann in die Situation käme (ist heut nicht der Fall), die ausgeschlossenen Datensätze extrahieren zu müssen, würde das gehen??</p> <p>Gruß, Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763103#m1763103 Rolf B 2020-01-17T09:44:21Z 2020-01-17T09:44:21Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Pit,</p> <p>das scheint mir jetzt nicht schwierig zu sein; ich hätte gedacht, dass Du Dir diese Frage selbst beantworten kannst.</p> <p>Entweder verstehe ich dein Problem bei der Sache nicht, oder Du müsstest mir sagen, was Du an dem Import-SQL nicht verstanden hast.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763105#m1763105 Pit 2020-01-17T09:49:46Z 2020-01-17T09:49:46Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Rolf,</p> <blockquote> <p>Entweder verstehe ich dein Problem bei der Sache nicht, oder Du müsstest mir sagen, was Du an dem Import-SQL nicht verstanden hast.</p> </blockquote> <p>Ich vermute, ich habe mich falsch ausgedrückt.</p> <blockquote> <p>Eine Zusatzfrage: Wenn ich mal irgendwann in die Situation käme (ist heut nicht der Fall), die ausgeschlossenen Datensätze extrahieren zu müssen, würde das gehen??</p> </blockquote> <p>Die Datensätze werden perfekt extrahiert. Die Zusatzfrage soll eher sein: Könnte man die extrahierten Datensätze aus der temp_table zusätzlich in eine temp_table2 kopieren (natürlich ohne die Datensätze, die in die real_table kopiert wurden)?</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763108#m1763108 Pit 2020-01-17T10:58:34Z 2020-01-17T10:58:34Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <blockquote> <p>Die Zusatzfrage soll eher sein: Könnte man die extrahierten Datensätze aus der temp_table zusätzlich in eine temp_table2 kopieren (natürlich ohne die Datensätze, die in die real_table kopiert wurden)?</p> </blockquote> <p>Man könnte natürlich vorab folgende Query machen:</p> <pre><code class="block language-sql"><span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> temp_table_extrahiert <span class="token punctuation">(</span>feld1<span class="token punctuation">,</span> feld2<span class="token punctuation">,</span> feld3<span class="token punctuation">,</span> feld4<span class="token punctuation">,</span> feld5<span class="token punctuation">,</span> feld6<span class="token punctuation">)</span> <span class="token keyword">SELECT</span> feld1<span class="token punctuation">,</span> feld2<span class="token punctuation">,</span> feld3<span class="token punctuation">,</span> feld4<span class="token punctuation">,</span> feld5<span class="token punctuation">,</span> feld6 <span class="token keyword">FROM</span> temp_table <span class="token keyword">WHERE</span> <span class="token punctuation">(</span>feld2<span class="token punctuation">,</span> feld3<span class="token punctuation">)</span> <span class="token operator">IN</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> feld2<span class="token punctuation">,</span> feld3 <span class="token keyword">FROM</span> temp_table <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> feld2<span class="token punctuation">,</span> feld3 <span class="token keyword">HAVING</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">)</span> </code></pre> <p>und anschließend dann erst:</p> <pre><code class="block language-sql"><span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> real_table <span class="token punctuation">(</span>feld1<span class="token punctuation">,</span> feld2<span class="token punctuation">,</span> feld3<span class="token punctuation">,</span> feld4<span class="token punctuation">,</span> feld5<span class="token punctuation">,</span> feld6<span class="token punctuation">)</span> <span class="token keyword">SELECT</span> feld1<span class="token punctuation">,</span> feld2<span class="token punctuation">,</span> feld3<span class="token punctuation">,</span> feld4<span class="token punctuation">,</span> feld5<span class="token punctuation">,</span> feld6 <span class="token keyword">FROM</span> temp_table <span class="token keyword">WHERE</span> <span class="token punctuation">(</span>feld2<span class="token punctuation">,</span> feld3<span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token operator">IN</span> <span class="token punctuation">(</span><span class="token keyword">SELECT</span> feld2<span class="token punctuation">,</span> feld3 <span class="token keyword">FROM</span> temp_table <span class="token keyword">GROUP</span> <span class="token keyword">BY</span> feld2<span class="token punctuation">,</span> feld3 <span class="token keyword">HAVING</span> <span class="token function">COUNT</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">)</span> </code></pre> <p>Oder kann man diese Queries auch mit UNION verbinden?</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763115#m1763115 Rolf B 2020-01-17T12:43:09Z 2020-01-17T13:09:15Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Pit,</p> <p>genau so geht es.</p> <p>Und nein, eine „Ausgangsweiche“ gibt's in SQL nicht. Du kannst mit einem UNION zwei Datenquellen verbinden (sozusagen eine „Eingangsweiche“). Aber Du kannst eine Datenquelle nicht auf zwei Ziele aufteilen. Dazu musst Du, so wie jetzt besprochen, zwei Queries nacheinander laufen lassen, die je Ziel die jeweiligen Sätze selektieren.</p> <p>Es gibt Transformationstools, in denen Du sowas machen kannst. Das ist dann aber ein Addon zu MYSQL. Im Microsoft SQL Server, mit dem ich arbeite, gibt es SSIS (SQL Server Integration Services), mit denen man Dataflows dieser Art grafisch modellieren kann. Was es an freien oder kostenpflichtigen Produkten für MYSQL gibt, weiß ich nicht.</p> <p>Du kannst das natürlich auch in PHP schreiben. Dazu selektierst Du die temp-Tabelle sortiert nach feld2, feld3, liest Dich mit zweifachem Vorauslesen hindurch (um Duplikate zu finden) und schreibst je nach dem die Sätze nach links oder rechts. Das ist allerdings nicht <em>ganz</em> trivial und es ist nicht generisch, d.h. du passt das Script für jeden Sachverhalt neu an.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763116#m1763116 Tabellenkalk 2020-01-17T12:52:26Z 2020-01-17T12:52:26Z csv Datei von Duplikaten befreien / Neue Frage <p>Hallo,</p> <blockquote> <blockquote> <p>nicht mehr ganz meinem Vorhaben</p> </blockquote> <p>[...] Dein Vorhaben [...] viele Antworten, [...] nichts nützen.</p> </blockquote> <p>und wenn dann noch die Antwortenden mit ihren Antworten auf andere Antwortende antworten, aber eigentlich anderen antworten wollten, erreichen wir eine ziemlich gute Annäherung ans Chaos…</p> <p>Gruß<br> Kalk</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763117#m1763117 Pit 2020-01-17T13:07:37Z 2020-01-17T13:07:37Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Rolf,</p> <blockquote> <p>genau so geht es.</p> </blockquote> <p>Prima.</p> <blockquote> <p>Und nein, eine „Ausgangsweiche“ gibt's in SQL nicht. Du kannst mit einem UNION zwei Datenquellen verbinden (sozusagen eine „Eingangsweiche“). Aber Du kannst eine Datenquelle nicht auf zwei Ziele aufteilen. Dazu musst Du, so wie jetzt besprochen, zwei Queries nacheinander laufen lassen, die je Ziel die jeweiligen Sätze selektieren.</p> </blockquote> <p>Ja, habe ich auch schon gemerkt. Ich habe es mit UNION getestet, aber natürlich entsprechend Deiner Erklärung einen Fehler erhalten.</p> <blockquote> <p>Es gibt Transformationstools...</p> </blockquote> <p>Muß nicht. Ich kann gut damit leben, 2 Queries abzusetzen.</p> <p>Aber ich hätte noch eine Frage, und zwar habe ich gemerkt, dass viele Datensätze aussortiert werden, die das auch verdient haben Aber bei dieser Durchsicht fiel mir auf, dass es ja schön wäre, wenn von den Datensätzen, bei denen <strong>wirklich alle</strong> Felder identisch sind, doch 1 Datensatz in die real_table kopiert werden würde.</p> <p>Hast Du eine Idee?</p> <p>Gruß, Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763120#m1763120 Rolf B 2020-01-17T13:30:13Z 2020-01-17T13:34:36Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Pit,</p> <p>am einfachsten wäre es wohl, wenn Du die extrahierten Sätze mit <code>SELECT DISTINCT</code> in <code>temp_table_extrahiert</code> einfügst. Die, die komplett identisch waren, stehen dann nur einmal in <code>temp_table_extrahiert</code>.</p> <p>Wenn Du nun die NOT IN Query noch einmal laufen lässt, mit <code>temp_table_extrahiert</code> an Stelle von <code>temp_table</code> als Quelle (an beiden Stellen!), sollten diese Sätze ebenfalls übernommen werden.</p> <p>Dann sind es 3 Queries, und es ist ein ziemliches Gefummel, ich weiß.</p> <p>Und die vierte Query sowie eine weitere Table folgen dann für den Extrakt des Extraktes, damit Du die Sätze hast, die WIRKLICH nicht importiert wurden.</p> <p>Wenn Du keine weitere Table willst, müsstest Du temp_table putzen und temp_table_extrahiert dorthin kopieren, bevor Du den zweiten Lauf machst. Dann musst Du auch die Query nicht anpassen ;)</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763122#m1763122 Pit 2020-01-17T14:07:36Z 2020-01-17T14:07:36Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Rolf,</p> <p>ich habe gerade nochmal nachgesehen. Auch die Daten für die temp_table kommen aus einem Array, d.h. ich kann schon im php <code>array_unique</code> anwenden. </p> <p>Kommt letztlich auf dasselbe raus, ich hatte nur nicht daran gedacht...</p> <p>Gruß, Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763123#m1763123 Rolf B 2020-01-17T14:43:18Z 2020-01-17T14:43:18Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Pit,</p> <p>äh wie? Du schreibst die Daten selbst mit PHP?</p> <p>Aber warum, zum grundgütigen Geier, dann die Umstände? Dann kannst Du doch auch die Duplikate bei feld2/feld3 eliminieren, bevor Du die CSV Datei schreibst.</p> <p>Das ist natürlich nicht ganz einfach, und der Algorithmus hängt auch davon ab, ob es außer Duplikaten auch drei oder mehr Sätze mit gleichen Werten für feld2/feld3 geben kann.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763125#m1763125 Rolf B 2020-01-17T15:18:28Z 2020-01-17T15:18:28Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Pit,</p> <p>ich habe mal experimentiert - wenn Du die Daten bereits als Array vorliegen hast, ist es am einfachsten, wenn Du sie in eine hierarchische Darstellung überführst.</p> <p>Damit meine ich ein Array, in dem die Werte von feld2 der Key sind. Jeder Eintrag davon ist ein Array, in dem die Werte von feld3 der Key sind. Und davon ist jeder Eintrag ein Array mit den Zeilen, die diese Wertekombination für feld2 und feld3 haben.</p> <p>Diese Arrayhierarchie durchläufst Du dann mit foreach und kannst auf jedes Zeilen-Array einen array_unique anwenden. Ist der count für dieses Array dann 1, schreibst Du dafür den CSV Satz. Oder machst sofort den Insert in die real_table und sparst Dir das CSV Geraffel.</p> <p>Mal angenommen, alle Sätze stehen in einem Array $data.</p> <pre><code class="block language-php"><span class="token variable">$data</span> <span class="token operator">=</span> <span class="token keyword">ARRAY</span><span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token string double-quoted-string">"feld1"</span> <span class="token operator">=></span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"feld2"</span> <span class="token operator">=></span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"feld3"</span> <span class="token operator">=></span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"feld4"</span> <span class="token operator">=></span> <span class="token string double-quoted-string">"Mumpf"</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string double-quoted-string">"feld1"</span> <span class="token operator">=></span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"feld2"</span> <span class="token operator">=></span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"feld3"</span> <span class="token operator">=></span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"feld4"</span> <span class="token operator">=></span> <span class="token string double-quoted-string">"Foo"</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string double-quoted-string">"feld1"</span> <span class="token operator">=></span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"feld2"</span> <span class="token operator">=></span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"feld3"</span> <span class="token operator">=></span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"feld4"</span> <span class="token operator">=></span> <span class="token string double-quoted-string">"Foo"</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string double-quoted-string">"feld1"</span> <span class="token operator">=></span> <span class="token number">45</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"feld2"</span> <span class="token operator">=></span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"feld3"</span> <span class="token operator">=></span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"feld4"</span> <span class="token operator">=></span> <span class="token string double-quoted-string">"Dings"</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string double-quoted-string">"feld1"</span> <span class="token operator">=></span> <span class="token number">46</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"feld2"</span> <span class="token operator">=></span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"feld3"</span> <span class="token operator">=></span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"feld4"</span> <span class="token operator">=></span> <span class="token string double-quoted-string">"Pings"</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Das überführst Du in die genannte Hierarchie. Statt foreach ($data as $row) kann es auch eine while-Schleife sein, die ein SQL Query-Result einliest.</p> <pre><code class="block language-php"><span class="token variable">$rowDict</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$data</span> <span class="token keyword">as</span> <span class="token variable">$row</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$f2</span> <span class="token operator">=</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"feld2"</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// Variablen für Lesbarkeit</span> <span class="token variable">$f3</span> <span class="token operator">=</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"feld3"</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$rowDict</span><span class="token punctuation">[</span><span class="token variable">$f2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$rowDict</span><span class="token punctuation">[</span><span class="token variable">$f2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token variable">$f3</span> <span class="token operator">=></span> <span class="token punctuation">[</span> <span class="token variable">$row</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$rowDict</span><span class="token punctuation">[</span><span class="token variable">$f2</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token variable">$f3</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$rowDict</span><span class="token punctuation">[</span><span class="token variable">$f2</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token variable">$f3</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token variable">$row</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token variable">$rowDict</span><span class="token punctuation">[</span><span class="token variable">$f2</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token variable">$f3</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$row</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>Die Schleife prüft Stufe für Stufe der Hierarchie, ob es für diese Stufe schon einen Eintrag gibt. Wenn nicht, wird der Eintrag auf dieser Stufe angelegt. Wenn doch, wird die Stufe entsprechend ergänzt.</p> <p>Das kannst Du nun verarbeiten:</p> <pre><code class="block language-php"><span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$rowDict</span> <span class="token keyword">as</span> <span class="token variable">$f2Dict</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$f2Dict</span> <span class="token keyword">as</span> <span class="token variable">$rows</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$uniqRows</span> <span class="token operator">=</span> <span class="token function">array_unique</span><span class="token punctuation">(</span><span class="token variable">$rows</span><span class="token punctuation">,</span> <span class="token constant">SORT_REGULAR</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">count</span><span class="token punctuation">(</span><span class="token variable">$uniqRows</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token function">importToDatabase</span><span class="token punctuation">(</span><span class="token variable">$uniqRows</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">else</span> <span class="token function">writeDuplicates</span><span class="token punctuation">(</span><span class="token variable">$uniqRows</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p><code>importToDatabase</code> kann den CSV Satz schreiben, oder direkt den INSERT machen. Und <code>writeDuplicates</code> kann eine CSV-Datei mit den Duplikaten schreiben, oder sie in eine Tabelle mit den Duplikaten INSERTen. Ganz wie Du willst.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763124#m1763124 Pit 2020-01-17T15:17:59Z 2020-01-17T15:17:59Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Rolf,</p> <blockquote> <p>äh wie? Du schreibst die Daten selbst mit PHP?</p> </blockquote> <p>Nein, ich schreibe sie nicht selber. Ich erhalte eine fertige CSV-Datei, die ich in php einlese. Sie liegen dann eben nur bereits in einem array vor, genauer gesagt, in einem assoziativem Array.</p> <pre><code class="block">Array ( [0] => Array ( [0] => Feld 1 [1] => Feld 2 [2] => Feld 3 [3] => Feld 4 ) [1] => Array ( [0] => Feld 1 [1] => Feld 2 [2] => Feld 3 [3] => Feld 4 ) usw. ) </code></pre> <blockquote> <p>Aber warum, zum grundgütigen Geier, dann die Umstände? Dann kannst Du doch auch die Duplikate bei feld2/feld3 eliminieren, bevor Du die CSV Datei schreibst.</p> </blockquote> <p>Und ab hier trage ich in die DB ein, nämlich in temp_table.</p> <blockquote> <p>Das ist natürlich nicht ganz einfach, und der Algorithmus hängt auch davon ab, ob es außer Duplikaten auch drei oder mehr Sätze mit gleichen Werten für feld2/feld3 geben kann.</p> </blockquote> <p>Klar, sowas kommt (leider) vor.</p> <p>Ich eliminiere jetzt die <strong>wirklich gleichen Zeilen</strong> in der temp_table so:</p> <pre><code class="block">INSERT INTO TABLE_temp2 SELECT DISTINCT * FROM TABLE_temp; DELETE FROM TABLE_temp; INSERT INTO TABLE_temp SELECT * FROM TABLE_temp2 DELETE FROM TABLE_temp2; </code></pre> <p>Ein unnötiger Schritt dabei, ich weiß. ich könnte auch von der TABLE2 in die real_table kopieren.</p> <p>Aber wenn ich Dich richtig verstehe, würdest Du inzwischen alles über php machen?</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763126#m1763126 Pit 2020-01-17T15:29:24Z 2020-01-17T15:29:24Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Rolf,</p> <blockquote> <p>ich habe mal experimentiert - wenn Du die Daten bereits als Array vorliegen hast, ist es am einfachsten, wenn Du sie in eine hierarchische Darstellung überführst.</p> <p>Damit meine ich ein Array, in dem die Werte von feld2 der Key sind. Jeder Eintrag davon ist ein Array, in dem die Werte von feld3 der Key sind. Und davon ist jeder Eintrag ein Array mit den Zeilen, die diese Wertekombination für feld2 und feld3 haben.</p> </blockquote> <p>Oweia, jetzt wirds mir zu kompliziert Ich fand die sql-Lösung sehr sympatisch. Zudem muß ich im php-Teil noch jede Menge Felder bearbeiten, ergänzen, tauschen, usw. Da das wirklich seit langem sehr sauber läuft, würde ich eigentlich da gerne nicht mehr Hand anlegen. Insofern kam und kommt mir die sql-Lösung eigentlich sehr entgegen.</p> <p>Würde Deine php-Lösung eigentlich sehr viel einfacher, wenn anstelle von Feld[2] und Feld[3] lediglich auf eines der beiden Felder geprüft werden müßte? Ich frage nur, weil ich glaiube, dass auch das ausreichen könnte, wenn ich einen anderen teil umprogrammiere.</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763128#m1763128 Rolf B 2020-01-17T16:17:44Z 2020-01-17T16:17:44Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Pit,</p> <p>nein, nicht sehr viel. Die Array-Hierarchie sinkt um eine Stufe, d.h. die Abfragen beim Aufbau werden etwas einfacher, und beim Auslesen ist ein foreach weniger.</p> <p>D.h. statt 23 Codezeilen sind's dann 18 oder so.</p> <p>Das unsympathische an der SQL Lösung ist für mich, dass Du Daten erstmal rausschreibst, um sie extern zu überarbeiten. Dann importierst Du sie wieder. Es stellt sich nun heraus, dass die Überarbeitung eigentlich ganz einfach ist, man muss nur das Problem lösen, die Sätze mit gleichem Key zusammen zu bekommen.</p> <p>Dafür gibt's auch andere Möglichkeiten wie eine Array-Hierarchie, aber die sind eher komplizierter.</p> <p>Nur Mut! </p> <p>Das $rowDict Array würde für meine Beispieldaten von oben so aussehen (ich zeige für die Rows nur feld4, sonst wird's für das Forum zu breit). Für die Keys 4, 9 würde array_unique eine Identität erkennen und der Satz würde importiert werden.</p> <pre><code class="block language-php"><span class="token variable">$rowDict</span> <span class="token operator">=</span> <span class="token keyword">ARRAY</span><span class="token punctuation">(</span> <span class="token number">4</span> <span class="token operator">=></span> <span class="token keyword">ARRAY</span><span class="token punctuation">(</span> <span class="token number">9</span> <span class="token operator">=></span> <span class="token keyword">ARRAY</span><span class="token punctuation">(</span> <span class="token keyword">ARRAY</span><span class="token punctuation">(</span><span class="token operator">...</span><span class="token operator">.</span> <span class="token string double-quoted-string">"feld4"</span> <span class="token operator">=></span> <span class="token string double-quoted-string">"Foo"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">ARRAY</span><span class="token punctuation">(</span><span class="token operator">...</span><span class="token operator">.</span> <span class="token string double-quoted-string">"feld4"</span> <span class="token operator">=></span> <span class="token string double-quoted-string">"Foo"</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">5</span> <span class="token operator">=></span> <span class="token keyword">ARRAY</span><span class="token punctuation">(</span> <span class="token number">2</span> <span class="token operator">=></span> <span class="token keyword">ARRAY</span><span class="token punctuation">(</span> <span class="token keyword">ARRAY</span><span class="token punctuation">(</span><span class="token operator">...</span><span class="token operator">.</span> <span class="token string double-quoted-string">"feld4"</span> <span class="token operator">=></span> <span class="token string double-quoted-string">"Dings"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">ARRAY</span><span class="token punctuation">(</span><span class="token operator">...</span><span class="token operator">.</span> <span class="token string double-quoted-string">"feld4"</span> <span class="token operator">=></span> <span class="token string double-quoted-string">"Pings"</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">7</span> <span class="token operator">=></span> <span class="token keyword">ARRAY</span><span class="token punctuation">(</span> <span class="token number">8</span> <span class="token operator">=></span> <span class="token keyword">ARRAY</span><span class="token punctuation">(</span> <span class="token keyword">ARRAY</span><span class="token punctuation">(</span><span class="token operator">...</span><span class="token operator">.</span> <span class="token string double-quoted-string">"feld4"</span> <span class="token operator">=></span> <span class="token string double-quoted-string">"Mumpf"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Lässt Du feld2 oder feld3 weg, hat diese Hierarchie eine Stufe weniger.</p> <p>Sind feld2 und feld3 beides Strings, könntest Du auch einen kombinierten Schlüssel machen, sowas wie $feld2."~".$feld3, und den als Key für das Dictionary nutzen. Dann hast Du eine Hierarchiestufe weniger, aber kannst trotzdem beide Schlüssel verwenden. Der Aufbau des Dictionary sieht dann so aus (da Du ein Freund von ARRAY() statt [] zu sein scheinst, habe ich das mal verwendet):</p> <pre><code class="block language-php"><span class="token variable">$rowDict</span> <span class="token operator">=</span> <span class="token keyword">ARRAY</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$data</span> <span class="token keyword">as</span> <span class="token variable">$row</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$key</span> <span class="token operator">=</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"feld2"</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"~"</span> <span class="token operator">.</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"feld3"</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// Schlüssel der Row</span> <span class="token comment">// Noch kein Eintrag zum $key -> Neues Subarray anlegen</span> <span class="token comment">// Andernfalls an's vorhandene Subarray anhängen.</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$rowDict</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$rowDict</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">ARRAY</span><span class="token punctuation">(</span> <span class="token variable">$key</span> <span class="token operator">=></span> <span class="token variable">$row</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token variable">$rowDict</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$row</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>Bei der Auswertung entfällt dann eine der geschachtelten foreach-Schleifen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763137#m1763137 Pit 2020-01-18T11:31:23Z 2020-01-18T11:31:23Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Rolf,</p> <p>ich habe das jetzt mal testhalber umgesetzt und es läuft auch. Trotzdem ist mir die SQL-Lösung in Summe gesehen sympatischer, was vielleicht auch daran liegehn mag, dass ich den SQL-Ansatz gleich in 2 verschiedene Teile meines Programms habe einsetzen können.</p> <p>Zudem kann ich die reine Query auch nativ im phpmyadmin imm er dort nutzen, wo ich nachträglich einen unique Index setzen möchte. Alles in allem also für mich ein sehr hilfreiches Code-Snippet. (Hierfür und überhaupt für Deine Mühe nochmal herzlichen Dank!).</p> <p>Ich habe aber noch eine Frage, die mich gerade beschäftigt und in das Thema passt, nämlich würde ich gerne in meinem Array, in dem die Zeilen der CSV-Datei das Array bilden, für jede Zeile nachzählen, ob die Anzahl der Delimiter gleich ist. Das hört sich erstmal einfacher an, als es ist, wie ich finde.</p> <pre><code class="block language-php"> <span class="token variable">$myCsvArray</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"\n"</span><span class="token punctuation">,</span><span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token variable">$csv_datei</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$myCsvArray</span> <span class="token keyword">AS</span> <span class="token variable">$myEinzelZeile</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$myCount</span> <span class="token operator">=</span> <span class="token function">substr_count</span><span class="token punctuation">(</span><span class="token variable">$myEinzelZeile</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'|'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Es fängt damit an, schwierig zu werden, dass ich keinen Anhaltswert für die "passende" Anzahl an Delimitern habe. Diese würde ich auch gerne <strong>nicht</strong> manuell vorgeben, sprich, ich müßte sie aus meinem Array erstmal ableiten. Hilfreich hierbei ist zu wissen, dass 99% der Zeilen die passende Anzahl an Delimitern vorweisen. Frage also, wie spucke ich mir die Zeilen aus, die ggf. zu wenige Delimiter haben, aus??</p> <p>Meine Idee wäre, erstmal die ersten 100 Zeilen zu durchlaufen und dadurch die "passende Anzahl" an Delimitern festzulegen. Anschließend würde ich dann neu anfangen und alle Zeilen durchlaufen.</p> <p>Hast Du (oder natürlich auch jeder andere) eine bessere Idee?</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763138#m1763138 Pit 2020-01-18T12:09:16Z 2020-01-18T12:09:16Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <blockquote> <p>Meine Idee wäre, erstmal die ersten 100 Zeilen zu durchlaufen und dadurch die "passende Anzahl" an Delimitern festzulegen. Anschließend würde ich dann neu anfangen und alle Zeilen durchlaufen.</p> </blockquote> <pre><code class="block language-php"> <span class="token comment">// Zählen, ob Anzahl der Delimiter je Zeile identisch ist</span> <span class="token variable">$myCsvArray</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"\n"</span><span class="token punctuation">,</span><span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token variable">$csv_datei</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$zahl5</span> <span class="token operator">=</span> <span class="token variable">$maxCount</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span><span class="token punctuation">(</span><span class="token variable">$myCsvArray</span> <span class="token keyword">AS</span> <span class="token variable">$myEinzelZeile</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$zahl5</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token variable">$myCount</span> <span class="token operator">=</span> <span class="token function">substr_count</span><span class="token punctuation">(</span><span class="token variable">$myEinzelZeile</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'|'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$myCount</span> <span class="token operator">></span> <span class="token variable">$maxCount</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$maxCount</span> <span class="token operator">=</span> <span class="token variable">$myCount</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$zahl5</span> <span class="token operator">==</span> <span class="token number">100</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$myErforderlicheDelimiter</span> <span class="token operator">=</span> <span class="token variable">$maxCount</span><span class="token punctuation">;</span> <span class="token variable">$myZeile</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span><span class="token punctuation">(</span><span class="token variable">$myCsvArray</span> <span class="token keyword">AS</span> <span class="token variable">$myEinzelZeile</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$myZeile</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">substr_count</span><span class="token punctuation">(</span><span class="token variable">$myEinzelZeile</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'|'</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token variable">$myErforderlicheDelimiter</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Fehlerhafte Anzahl Delimiter in Zeile "</span><span class="token operator">.</span><span class="token variable">$myZeile</span><span class="token operator">.</span><span class="token string double-quoted-string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>Hast Du (oder natürlich auch jeder andere) eine bessere Idee?</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763139#m1763139 Raketenwissenschaftler 2020-01-18T12:52:09Z 2020-01-18T12:52:09Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <blockquote> <pre><code class="block language-php"><span class="token variable">$myCount</span> <span class="token operator">=</span> <span class="token function">substr_count</span><span class="token punctuation">(</span><span class="token variable">$myEinzelZeile</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'|'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Ist denn in Deiner Definition von CSV eventuell vorgesehen oder ausgeschlossen, dass das als Trenner verwendete PIPE-Symbol in den Werten selbst vorkommt und wie wird es im ersten Fall maskiert?</p> <blockquote> <blockquote> <p>(Pit:) Es fängt damit an, schwierig zu werden, dass ich keinen Anhaltswert für die "passende" Anzahl an Delimitern habe.</p> </blockquote> </blockquote> <p>Den gäbe es wohl, wenn Du endlich damit herausrücken würdest wie das CSV denn erzeugt wird.</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763140#m1763140 Pit 2020-01-18T13:07:31Z 2020-01-18T13:07:31Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hi,</p> <blockquote> <p>Ist denn in Deiner Definition von CSV eventuell vorgesehen oder ausgeschlossen, dass das als Trenner verwendete PIPE-Symbol in den Werten selbst vorkommt und wie wird es im ersten Fall maskiert?</p> </blockquote> <p>Pipe kommt nicht vor. Falls doch, ersetze ich sie durch etwas anderes, bevor ich überhaupt anfange.</p> <blockquote> <blockquote> <blockquote> <p>(Pit:) Es fängt damit an, schwierig zu werden, dass ich keinen Anhaltswert für die "passende" Anzahl an Delimitern habe.</p> </blockquote> </blockquote> <p>Den gäbe es wohl, wenn Du endlich damit herausrücken würdest wie das CSV denn erzeugt wird.</p> </blockquote> <p>Ich bekomme fertige Excellisten, die ich in csv-Dateien überführe. Soll heißen, ich habe nahezu keinen Einfluß auf die csv, wenn ich mal vom Delimiter oder dem Feldtrenner absehe.</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763141#m1763141 Raketenwissenschaftler 2020-01-18T13:27:45Z 2020-01-18T13:27:45Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <blockquote> <p>Ich bekomme fertige Excellisten, die ich in csv-Dateien überführe.</p> </blockquote> <p>Warum machst Du es Dir dann schwer?</p> <ul> <li><a href="https://www.php.net/manual/en/function.fgetcsv.php" rel="nofollow noopener noreferrer">fgetcsv()</a></li> </ul> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763155#m1763155 Felix Riesterer https://felix-riesterer.de 2020-01-18T16:28:06Z 2020-01-18T16:28:06Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Lieber Pit,</p> <blockquote> <p>Ich bekomme fertige Excellisten, die ich in csv-Dateien überführe.</p> </blockquote> <p>ab jetzt wirkt die Sache auf mich doch reichlich seltsam. DU erzeugst die CSV-Dateien. DU hast die Kontrolle über die Anzahl Spalten. DU willst das Pipe-Symbol als Trenner nutzen.</p> <p>Warum soll dann PHP flexibel auf Deine CSV-Dateien reagieren?</p> <p>Warum wertet PHP Deine Excel-Dateien nicht direkt aus? <a href="https://github.com/PHPOffice" rel="noopener noreferrer">PHP-Office existiert</a>.</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763142#m1763142 Pit 2020-01-18T13:54:24Z 2020-01-18T13:54:24Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <blockquote> <blockquote> <p>Ich bekomme fertige Excellisten, die ich in csv-Dateien überführe.</p> </blockquote> <p>Warum machst Du es Dir dann schwer?</p> <ul> <li><a href="https://www.php.net/manual/en/function.fgetcsv.php" rel="nofollow noopener noreferrer">fgetcsv()</a></li> </ul> </blockquote> <p>Aber die Art, wie ich die Datei einlese, beantwortet doch meine Frage nicht?</p> <p>Oder möchtest Du mir noch erklären, was genau Du mir sagen willst?</p> <p><a href="https://www.php.net/manual/en/function.fgetcsv.php" rel="nofollow noopener noreferrer">fgetcsv()</a> kenne und nutze ich. Es geht aber doch jetzt darum, die korrekte Anzahl der Delimiter für die jeweilige Datei zu ermitteln und anschließend event. fehlerhafte Zeilen auszugeben. Das klappt mit miener obigen Lösung sehr gut. Was würde also <a href="https://www.php.net/manual/en/function.fgetcsv.php" rel="nofollow noopener noreferrer">fgetcsv()</a> hieran verbessern?</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763143#m1763143 Rolf B 2020-01-18T14:01:03Z 2020-01-18T14:01:03Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Raketenwissenschaftler,</p> <p>TIL: CSV in PHP </p> <p>Es gibt auch noch <a href="https://www.php.net/manual/en/function.str-getcsv.php" rel="nofollow noopener noreferrer">str_getcsv</a>, falls man die Zeile bereits in einem String hat.</p> <p>Aber sicherlich ist es effizienter (speichermäßig), die Datei mit fopen zu öffnen und mit fgetcsv zu lesen (auf der fgetcsv-Seite von php.net ist auch ein Code-Snippet dafür).</p> <p>Und dann würde ich die Einträge in dem Array zählen, das fgetcsv liefert, und in einem Array zählen, welche Länge wie oft vorkommt. Sowas wie</p> <pre><code class="block language-php"><span class="token variable">$haeufigkeit</span> <span class="token operator">=</span> <span class="token keyword">ARRAY</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$anz_zeilen</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$data</span> <span class="token operator">=</span> <span class="token function">fgetcsv</span><span class="token punctuation">(</span><span class="token variable">$handle</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">","</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">!==</span> <span class="token constant boolean">FALSE</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$anz_felder</span> <span class="token operator">=</span> <span class="token function">count</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$haeufigkeit</span><span class="token punctuation">[</span><span class="token variable">$anz_felder</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$haeufigkeit</span><span class="token punctuation">[</span><span class="token variable">$anz_felder</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token number">1</span> <span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token variable">$haeufigkeit</span><span class="token punctuation">[</span><span class="token variable">$anz_felder</span><span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$anz_zeilen</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token comment">// weitere Verarbeitung</span> <span class="token punctuation">}</span> </code></pre> <p>und dann musst Du Statistik machen und schauen, ob für einen der gefundenen Häufigkeitszähler die Quote <code>$haeufigkeit[$i] / $anz_zeilen</code> größer als 0.99 ist.</p> <p>Aber eigentlich müsstest Du doch eine bestimmte Anzahl von Feldern erwarten, oder?</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763144#m1763144 Pit 2020-01-18T14:13:48Z 2020-01-18T14:13:48Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Rolf,</p> <blockquote> <p>Aber eigentlich müsstest Du doch eine bestimmte Anzahl von Feldern erwarten, oder?</p> </blockquote> <p>Selbstverständlich weiß ich das. Aber ich finde es zum lernen viel spaßiger, es zu ermitteln. Und natürlich ist es auch (zwar nicht viel, aber immerhin) weniger Arbeit, wenn das Script das ermitteln übernimmt, zumal sich die Anzahl der Delimiter von csv zu csv ändert.</p> <p>Frage: Was ist denn effizienter?</p> <pre><code class="block">$myCsvArray = explode("\n",file_get_contents($csv_datei)); foreach($myCsvArray AS $myEinzelZeile) { ... } oder: $handle = fopen($csv_datei, "r"); while (($data = fgetcsv($handle)) !== FALSE) { ... } </code></pre> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763153#m1763153 Rolf B 2020-01-18T16:22:45Z 2020-01-18T16:22:45Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Pit,</p> <blockquote> <p>ich finde es zum lernen viel spaßiger</p> </blockquote> <p>Lernst Du? Oder lieferst Du ein Produkt an einen Kunden ab? Abgesehen davon: Wenn 10 Spalten erwartet werden, aber 99% der Zeilen haben 9 Spalten, was sagt das über die Datei? Ist sie falsch? Ist das normal? Solche Fragen musst Du beantworten können. Du erwartest ja bestimmte Daten, die Du in eine konkrete Tabelle importieren willst. Wenn es zu wenig Spalten sind, dann fehlt was. Was tust Du mit der Lücke?</p> <blockquote> <p>Was ist denn effizienter?</p> </blockquote> <p>Falsche Frage. Ok, nicht uninteressant, aber nicht entscheidend.</p> <p>Korrekte Frage: Was ist effektiver<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>? Du wirst das ja nicht alle 5 Minuten laufen lassen, darum ist Effizienz nachrangig. fgetcsv kümmert sich nicht nur um das Separieren derFelder in ein Array, sondern auch darum, delimited strings richtig zu behandeln (wenn z.B. der Feldseparator ein Zeichen in den Daten ist</p> <pre><code class="block language-csv"><span class="token value">1;47.11;</span><span class="token value">"Ein String; aber was für einer"</span><span class="token value">;1234</span> </code></pre> <p>fgetcsv sollte das korrekt behandeln. Ein eigener explode(";", $zeile) macht es falsch.</p> <p>Und ich denke, dass die fgetcsv Lösung auch effizienter ist. Sie liest die Datei Zeile für Zeile, so dass Du nicht die ganze Datei ins RAM saugen musst. Darüber hinaus sollte sie in C implementiert sein, d.h. sollte auch weniger Laufzeit als eine PHP Lösung brauchen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> <hr class="footnotes-sep"> <section class="footnotes"> <ol class="footnotes-list"> <li id="fn1" class="footnote-item"><p>effizient: schneller, speichersparender. effektiv: führt die geforderte Funktion korrekt aus <a href="#fnref1" class="footnote-backref">↩︎</a></p> </li> </ol> </section> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763157#m1763157 Matthias Apsel matthias.apsel@selfhtml.org https://brückentage.info 2020-01-18T16:32:28Z 2020-01-18T16:32:28Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Rolf B,</p> <blockquote> <p>Korrekte Frage: Was ist effektiver?</p> </blockquote> <p>effizient: schneller, speichersparender. effektiv: führt die geforderte Funktion korrekt aus</p> <p>Eben. Deshalb gibt es kein effektiver (siehe auch <a href="https://de.wiktionary.org/wiki/effektiv" rel="nofollow noopener noreferrer">wiktionary/effektiv</a>).</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763165#m1763165 Pit 2020-01-18T18:31:16Z 2020-01-18T18:31:16Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Rolf,</p> <blockquote> <blockquote> <p>ich finde es zum lernen viel spaßiger</p> </blockquote> <p>Lernst Du? Oder lieferst Du ein Produkt an einen Kunden ab?</p> </blockquote> <p>In diesem Fall lerne ich. Worum es hier geht, ist alleine für mich gescriptet und ich möchte darin lernen und daran wachsen.</p> <blockquote> <p>Abgesehen davon: Wenn 10 Spalten erwartet werden, aber 99% der Zeilen haben 9 Spalten, was sagt das über die Datei? Ist sie falsch?</p> </blockquote> <p>Halt stop. Das passiert nicht, denn ich überprüfe vorab, ob ein Spaltentext meinen Delimiter enthält. Deshalb können nicht mehr Delimiter erwartet werden als der zuvor ermittelte Max-Weret ist. Und selbst wenn, würden mir unerwartet viele fehler gemeldet, was mich auch dazu zwingen würde, mir die daten genauer anzusehen.</p> <blockquote> <blockquote> <p>Was ist denn effizienter?</p> </blockquote> <p>Falsche Frage. Ok, nicht uninteressant, aber nicht entscheidend.</p> <p>Korrekte Frage: Was ist effektiver[^1]? Du wirst das ja nicht alle 5 Minuten laufen lassen, darum ist Effizienz nachrangig. fgetcsv kümmert sich nicht nur um das Separieren derFelder in ein Array, sondern auch darum, delimited strings richtig zu behandeln (wenn z.B. der Feldseparator ein Zeichen in den Daten ist</p> </blockquote> <p>Auch wenn ich bereits Mathias' Antwort darauf gelesen habe, kann ich Deiunem Einwand etwas abgewinnen, egal wie wir das benennen. Du hast recht: Was ich meine, ist tatsächlich die Frage danach, welche Lösung im Fale des falles (sehr sehr viele Daten) noch durchläuft, nihct die Frage danach, welche Lösung das schneller macht.</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763163#m1763163 Pit 2020-01-18T18:20:49Z 2020-01-18T18:20:49Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <blockquote> <p>Lieber Pit,</p> <blockquote> <p>Ich bekomme fertige Excellisten, die ich in csv-Dateien überführe.</p> </blockquote> <p>ab jetzt wirkt die Sache auf mich doch reichlich seltsam. DU erzeugst die CSV-Dateien. DU hast die Kontrolle über die Anzahl Spalten. DU willst das Pipe-Symbol als Trenner nutzen.</p> </blockquote> <p>Klar, auf den Delimiter habe ich Einfluss, aber doch nicht auf die Anzahl der Spalten?!</p> <blockquote> <p>Warum soll dann PHP flexibel auf Deine CSV-Dateien reagieren?</p> </blockquote> <p>Nicht PHP, sondern mein php-Script.</p> <blockquote> <p>Warum wertet PHP Deine Excel-Dateien nicht direkt aus? <a href="https://github.com/PHPOffice" rel="noopener noreferrer">PHP-Office existiert</a>.</p> </blockquote> <p>Kannst Du da mal bitte genauer werden? Was genau ist das und was kann ich damit machen? Zumindest klingt es interessant.</p> <p>Grüße, Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763158#m1763158 Tabellenkalk 2020-01-18T16:38:17Z 2020-01-18T16:38:17Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo,</p> <blockquote> <p>Eben. Deshalb gibt es kein effektiver (siehe auch <a href="https://de.wiktionary.org/wiki/effektiv" rel="nofollow noopener noreferrer">wiktionary/effektiv</a>).</p> </blockquote> <p>Und wenn nun deine Frau schwangerer ist als meine?</p> <p>Gruß<br> Kalk</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763161#m1763161 Rolf B 2020-01-18T17:23:26Z 2020-01-18T17:23:26Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Matthias,</p> <blockquote> <p>Deshalb gibt es kein effektiver</p> </blockquote> <p>und das sagst Du mir zum einzigsten Mal, ich weiß.</p> <p>Für Software ist effektiv aber kein schwarz-weiß. Zum einen wegen der 80-20 Regel, zum anderen, weil jede nichttriviale Software mindestens einen Bug enthält.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763176#m1763176 MudGuard http://www.andreas-waechter.de/ 2020-01-18T21:42:55Z 2020-01-18T21:42:55Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hi,</p> <blockquote> <p>Und wenn nun deine Frau schwangerer ist als meine?</p> </blockquote> <p>dann bekommt sie Zwillinge und Deine Frau nur ein Kind.<br> Oder Drillinge und Zwillinge.<br> Oder Vierlinge und Drillinge.<br> Oder …</p> <p>cu,<br> Andreas a/k/a MudGuard</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763173#m1763173 Felix Riesterer https://felix-riesterer.de 2020-01-18T19:25:34Z 2020-01-18T19:25:34Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Lieber Pit,</p> <blockquote> <p>Klar, auf den Delimiter habe ich Einfluss, aber doch nicht auf die Anzahl der Spalten?!</p> </blockquote> <p>Du hast absoluten (lies: uneingeschränkten) Einfluss auf die Excel-Datei. Klar kannst Du dort die Anzahl der Spalten festlegen.</p> <blockquote> <p>Nicht PHP, sondern mein php-Script.</p> </blockquote> <p>Da habe ich das Acronym in diesem Sinne verwendet. PHP selbst kann erst etwas tun, wenn ich ein Script schreibe, das die Möglichkeiten von PHP nutzt.</p> <blockquote> <blockquote> <p>Warum wertet PHP Deine Excel-Dateien nicht direkt aus? <a href="https://github.com/PHPOffice" rel="noopener noreferrer">PHP-Office existiert</a>.</p> </blockquote> <p>Kannst Du da mal bitte genauer werden? Was genau ist das und was kann ich damit machen?</p> </blockquote> <p>Es ist eine PHP-Scripte-Sammlung, um damit Office-Dateien (MS-Office-Formate und auch OpenDocument wie es LibreOffice verwendet) zu lesen und zu schreiben.</p> <blockquote> <p>Zumindest klingt es interessant.</p> </blockquote> <p>Du könntest Dir damit das ganze Geraffel mit den CSV-Dateien sparen.</p> <p>Wenn man <a href="https://github.com/PHPOffice/PhpSpreadsheet" rel="noopener noreferrer">PhpSpreadsheet</a> aus der Sammlung einsetzt, kann man damit Inhalte von Excel-Dateien auswerten. Ich habe mit dem Vorgänger Excel-Dateien dynamisch erstellt und zum Download angeboten, sowie hochgeladene Excel-Dateien ausgelesen und deren Inhalte weiter verarbeitet.</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763180#m1763180 Pit 2020-01-19T08:00:47Z 2020-01-19T08:00:47Z csv Datei von Duplikaten befreien / Neue Frage und Antwort <p>Hallo Felix,</p> <blockquote> <blockquote> <p>Klar, auf den Delimiter habe ich Einfluss, aber doch nicht auf die Anzahl der Spalten?!</p> </blockquote> <p>Du hast absoluten (lies: uneingeschränkten) Einfluss auf die Excel-Datei. Klar kannst Du dort die Anzahl der Spalten festlegen.</p> </blockquote> <p>Nein, das kann ich nicht. Es sei denn, ich möchte auf Informationen aus den Dateien verzichten. Mein Script arbeitet aber so, dass ich alle Informationen der Datei aufnehmen kann, unabhängig davon, wieviele Spalten die Ursprungsdatei hat. Kürze ich aber die Anzahl der Spalten, gebe ich Informationen weg...und zwar ins digitale Nirvana.</p> <blockquote> <p>Du könntest Dir damit das ganze Geraffel mit den CSV-Dateien sparen.</p> <p>Wenn man <a href="https://github.com/PHPOffice/PhpSpreadsheet" rel="noopener noreferrer">PhpSpreadsheet</a> aus der Sammlung einsetzt, kann man damit Inhalte von Excel-Dateien auswerten. Ich habe mit dem Vorgänger Excel-Dateien dynamisch erstellt und zum Download angeboten, sowie hochgeladene Excel-Dateien ausgelesen und deren Inhalte weiter verarbeitet.</p> </blockquote> <p>Das finde ich sehr interesant. Habe ich zwar augenblicklich keine verwendung für (auch wenn es so ausschaut), aber ich guck mir das trotzdem mal an. Leider sind die aktuellen Dateien, die ich verarbeite, teilweise sowas von unsinnig erstellt, dass ich immer per Hand ran muß, bevor ich mein Script daruf ansetzen kann.</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763185#m1763185 Raketenwissenschaftler 2020-01-19T11:34:10Z 2020-01-19T11:34:10Z NoSQL? <blockquote> <p>Mein Script arbeitet aber so, dass ich alle Informationen der Datei aufnehmen kann, <strong>unabhängig davon, wieviele Spalten die Ursprungsdatei hat</strong>.</p> </blockquote> <p>Scheinbar bist Du an einem Punkt, <a href="https://www.guru99.com/sql-vs-nosql.html" rel="nofollow noopener noreferrer">an welchem das realtionale Datenbankmodell nicht mehr passt</a>.</p> <ul> <li>"Schema SQL databases have a <strong>predefined schema</strong>"</li> <li>"NoSQL databases use <strong>dynamic schema</strong> for <strong>unstructured data</strong>."</li> </ul> <p>Wenn Deine "Datensätze" in Deiner Datei nicht die gleiche Anzahl an Items haben, dann haben diese jeweils eine unterschiedliche, insgesamt ergo keine definierbare Struktur.</p> <p>Es sei denn natürlich, Du hast in ein Programm umsetzbare Anhaltspunkte (Definitionen) dafür, wie Du Deine kaputte Struktur (unterschiedliche Anzahl an Datensätzen) in eine definierte Struktur für eine SQL-Datenbank umwandeln willst.</p> <p>Dafür gibt es aber keine allgemeinen Regeln, die kann man nur für den speziellen Anwendungsfall bauen. Von Deinem speziellen Anwendungsfall weiß ich aber nicht genügend als dass ich effektiv helfen könnte. Anderen gehts auch so: Das ist hier "Stochern im Nebel".</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763186#m1763186 Raketenwissenschaftler 2020-01-19T11:38:47Z 2020-01-19T11:38:47Z NoSQL? (Korrektur) <blockquote> <p>Es sei denn natürlich, Du hast in ein Programm umsetzbare Anhaltspunkte (Definitionen) dafür, wie Du Deine kaputte Struktur (unterschiedliche Anzahl an Datensätzen) in eine definierte Struktur für eine SQL-Datenbank umwandeln willst.</p> </blockquote> <p>Muss heißen:</p> <p>Es sei denn natürlich, Du hast in ein Programm umsetzbare Definitionen dafür, wie Du Deine kaputte Struktur (unterschiedliche Anzahl an Items in den Zeilen) in eine definierte Struktur für eine SQL-Datenbank umwandeln willst.</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763203#m1763203 Pit 2020-01-19T18:12:04Z 2020-01-19T18:12:04Z Kritik an Deinem Umgang mit Hilfe <p>Hallo Felix,</p> <blockquote> <p>ich habe in diesem Thread genügend gelesen, um Dein Ausgangsposting infrage zu stellen.</p> <blockquote> <p>Die Datei ist wie folgt aufgebaut:</p> <pre><code class="block">Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 ... </code></pre> </blockquote> <p>Nein, das ist sie <a href="https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763137#m1763137" rel="noopener noreferrer">offensichtlich nicht</a>.</p> </blockquote> <p>Doch, genau davon bin ich ausgegangen als ich das Post schrieb. Nach einigen Dateien aber kam mir eine Datei unter, die inmitten eines feldes eines csv-Satzes einen zeilenumbruch hatte. Erst dann kam ich auf die Idee, je Zeile die Anzahl der Delimiter zu zählen. Es ging also danach um einen Ausbau der vorhandenen Lösung, die prinzipiell gut funktionierte.</p> <blockquote> <p>Das, was Du uns als Vorgabe nennst, trifft in Wirklichkeit auf Dein Problem nicht zu. Damit verurteilst Du diesen Thread zu einer rein akademischen Übung, bei der unsere Antworten auf Dein Problem nur ungenügend passen können, da Du uns die Wahrheit verschweigst.</p> </blockquote> <p>Was bemängelst Du? Das eine csv-Datei nur 5 Spalten hat, eine andere aber 10? Und das ich im DB-Import alles nach Spalte 5 der csv in die db-Spalte namens "Bemerkungen" eintrage?</p> <blockquote> <p>Aber das willst Du doch offensichtlich nicht! Der ganze Thread zeigt, dass Du in Wirklichkeit etwas von Deinem Ursprungsposting abweichendes erreichen willst, für das Du uns aber gezielt wesentliche Informationen vorenthältst.</p> </blockquote> <p>Nicht ganz richtig. Das Thema hat sich entwickelt.</p> <blockquote> <p>Wenn wir Dir wirklich <em>unter die Arme greifen</em> sollen, müsstest Du uns reinen Wein einschenken.</p> </blockquote> <p>Reinen Wein? Übertreibst Du nicht ein bißchen? </p> <blockquote> <p>Damit gehst Du aber das Risiko ein, dass man Dir aufzeigt, dass Dein bisheriges Vorgehen <a href="https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763185#m1763185" rel="noopener noreferrer">im Kern dafür ungeeignet</a> ist und eine Neukonzeption nötig hat. Dieses Risiko willst Du aber anscheinend vermeiden, da Du die dafür notwendigen Informationen ja eben zurückhältst.</p> </blockquote> <p>Nochmal: Auf die Anzahl der Spalten der csv habe ich gar keinen Einfluß. Die db hat (z.b.) 5 notwendige Spalten. Die csv hat 5 (notwendige) + n Spalten. Von den n Spalten kann ich n-x Spalten nutzen, die ich für nötig erachte, also jene, die meiner Tabelle einen Mehrwert bringen. Diese Spalten werden dann aber nach und nach in die Spalte "Bemerkungen" übernommen. x Spalten verfallen. An diesem Modell kann ich nichts Falsches erkennen. Einzig könnte man darüber reden, ob ich die Bemerkungen normalisieren könnte. Muß man aber nicht.</p> <blockquote> <p>Solltest Du wirklich Hilfe wollen, dann sei ehrlich und nenne alle(!) wesentlichen Fakten. Ansonsten beutest Du unsere Hilfsbereitschaft in einer Weise aus, die unredlich ist.</p> </blockquote> <p>Schade, dass sich (für Dich) Dinge anscheinend nicht entwickeln können/dürfen/sollen. Oder aber, dass man ggf. etwas vergisst, zu einem bestimmten Zeitpunkt nicht oder noch nicht weiß oder auch Fehler bei der Fragestellung macht.</p> <p>Wie dem auch sei, ich hatte nie vor, hier irgendwen auszubeuten oder sonstwie unredlich zu sein. Und ich bin auch davon überzeugt, dass ich das nie gemacht habe, nicht mache und auch ganz sicher nicht machen werde! Ich hoffe, ich habe es Dir schlüssig erklärt. Wenn nicht, kann ichs aber auch nicht ändern.</p> <p>Traurig genug, dass Du das anscheinend anders siehst/gesehen hast!</p> <p>Pit</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763204#m1763204 Der Martin 2020-01-19T18:55:30Z 2020-01-19T18:55:30Z Kritik an Deinem Umgang mit Hilfe <p>n'Abend Pit,</p> <p>ich habe zwar bisher nicht Sachliches beigetragen, aber jetzt mische ich mich doch noch als stellenweise genervter Mitleser ein. Genervt, weil ich auch den Eindruck hatte, dass du mit Informationen nur häppchenweise um die Ecke kommst, anstatt gleich die Karten auf den Tisch zu legen. Als jemand, der gewillt ist, das Thema anzupacken und zu helfen, fühlt man sich dann ausgenutzt oder veräppelt.</p> <blockquote> <blockquote> <blockquote> <p>Die Datei ist wie folgt aufgebaut:</p> <pre><code class="block">Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 Feld1|Feld2|Feld3|Feld4|Feld5 ... </code></pre> </blockquote> <p>Nein, das ist sie <a href="https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763137#m1763137" rel="noopener noreferrer">offensichtlich nicht</a>.</p> </blockquote> <p>Doch, genau davon bin ich ausgegangen als ich das Post schrieb.<br> Nach einigen Dateien aber kam mir eine Datei unter, die inmitten eines feldes eines csv-Satzes einen zeilenumbruch hatte.</p> </blockquote> <p>Daher also die Idee, die Zahl der Delimiter (also eigentlich die Zahl der Felder pro Datensatz) zu zählen und zu überprüfen. Ein kleiner Nebensatz an der passenden Stelle, der uns sagt, dass das eine neue Erkenntnis ist, wäre völlig ausreichend gewesen. So aber wirkt es, als hättest du das von Anfang an gewusst, aber "vergessen" zu erwähnen.</p> <p>Abgesehen davon: Eine CSV-Datei, die an unpassender Stelle einen Zeilenumbruch hat, würde ich als <em>ungültig</em> abweisen.</p> <blockquote> <p>Erst dann kam ich auf die Idee, je Zeile die Anzahl der Delimiter zu zählen. Es ging also danach um einen Ausbau der vorhandenen Lösung, die prinzipiell gut funktionierte.</p> </blockquote> <p>Angenommen, du holst Zeile für Zeile mit fgetcsv(), dann erledigt diese Funktion das Zählen für dich. Und wenn in der Datei <em>auch nur eine Zeile</em> vorkommt, die zu viele oder zu wenige Felder hat - Fehler beim Import, Eingabedatei ungültig!</p> <blockquote> <blockquote> <p>Das, was Du uns als Vorgabe nennst, trifft in Wirklichkeit auf Dein Problem nicht zu.</p> </blockquote> </blockquote> <p>Will heißen: Du sagst, du müsstest CSV-Dateien in eine Datenbank importieren. Die CSV-Dateien seien nicht immer ganz "sauber", deshalb muss deine Import-Funktion eine gewisse Fehlertoleranz haben.<br> Gut, akzeptiert. Aber dann kommst du mit der Neuigkeit raus, du selbst würdest die CSV-Dateien aus Excel generieren. Ja mei, dann hast du das Ergebnis doch auch selbst in der Hand und brauchst nicht am Ende nachzubessern, sondern kannst es gleich am Anfang richtig machen.</p> <blockquote> <p>Was bemängelst Du?<br> Das eine csv-Datei nur 5 Spalten hat, eine andere aber 10?</p> </blockquote> <p>Nein. Verschiedene Tabellen haben eine unterschidliche Anzahl von Spalten. Aber eine Import-Tabelle (Excel, CSV), die für einen bestimmten Zweck gedacht ist, <em>muss</em> eine bestimmte, vorgegebene Struktur haben. Dazu gehört nicht nur die Anzahl der Felder, sondern auch deren Typ (z.B. Zahl, Datum, Text). Diese Struktur ist von der Anwendung vorgegeben, für die die Daten gedacht sind. Passt da beim Import etwas nicht - Fehler beim Import, Eingabedatei ungültig!</p> <blockquote> <p>Und das ich im DB-Import alles nach Spalte 5 der csv in die db-Spalte namens "Bemerkungen" eintrage?</p> </blockquote> <p>Das ist ein ungewöhnliches Vorgehen. Das bedeutet, deine CSV-Datei kann 6 oder mehr Felder haben, und die Werte der Felder 6..n landen alle zusammen in einer Spalte in der DB?</p> <blockquote> <blockquote> <p>Wenn wir Dir wirklich <em>unter die Arme greifen</em> sollen, müsstest Du uns reinen Wein einschenken.</p> </blockquote> <p>Reinen Wein? Übertreibst Du nicht ein bißchen? </p> </blockquote> <p>Ja, Felix übertreibt vielleicht ein bisschen. Aber nicht viel.</p> <blockquote> <p>Nochmal: Auf die Anzahl der Spalten der csv habe ich gar keinen Einfluß.</p> </blockquote> <p>Aber sicher doch! Wenn du sie aus einer Excel-Tabelle erzeugst, bist du der Einzige, der einen Einfluss darauf hat.</p> <blockquote> <blockquote> <p>Solltest Du wirklich Hilfe wollen, dann sei ehrlich und nenne alle(!) wesentlichen Fakten. Ansonsten beutest Du unsere Hilfsbereitschaft in einer Weise aus, die unredlich ist.</p> </blockquote> <p>Schade, dass sich (für Dich) Dinge anscheinend nicht entwickeln können/dürfen/sollen. Oder aber, dass man ggf. etwas vergisst, zu einem bestimmten Zeitpunkt nicht oder noch nicht weiß oder auch Fehler bei der Fragestellung macht.</p> </blockquote> <p>Das ist völlig okay, solange nicht der Eindruck entsteht, das sei schon immer so gewesen und du hättest es bloß nicht erwähnt.</p> <p>Übrigens hätte ich noch einen ganz anderen möglichen Ansatz: Wenn die Daten aus einer Excel-Tabelle kommen, bietet es sich doch an, sie direkt in Excel passend aufzubereiten und von da direkt in die DB zu schreiben. AFAIK hat Excel einen SQL-Client integriert (im Detail wahrscheinlich MSSQL, es wäre zu prüfen, ob MySQL auch geht), und VBA ist auch kein Hexenwerk.</p> <p>Ciao,<br>  Martin</p> <div class="signature">-- <br> Ich stamme aus Ironien, einem Land am sarkastischen Ozean. </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763207#m1763207 Felix Riesterer https://felix-riesterer.de 2020-01-19T20:11:33Z 2020-01-19T20:11:33Z Kritik an Deinem Umgang mit Hilfe <p>Lieber Pit,</p> <p>ich habe nichts gegen Entwicklung. Wenn sie transparent ist, kann man sie als solche erkennen und akzeptieren. Die Transparenz hast Du nun ebenso wie zuvor schon andere Details nachgereicht.</p> <p>OK.</p> <blockquote> <p>Nach einigen Dateien aber kam mir eine Datei unter, die inmitten eines feldes eines csv-Satzes einen zeilenumbruch hatte.</p> </blockquote> <p>Siehst Du, jetzt reden wir wieder über ein neues aber wichtiges Detail. Ein <em>Zeilenumbruch</em>. Soll das bedeuten, dass in einer Zelle Inhalt mit Zeilenumbruch gestanden hat? Und der bringt Dir nun Deine CSV-Datei durcheinander. Das kann ich mir vorstellen, wenn die Datei nicht korrekt erstellt und dann geparst wurde. Aber die Notwendigkeit des Umwegs über eine CSV-Datei leuchtet mir noch immer nicht ein. <a href="/users/475" class="mention registered-user" rel="noopener noreferrer">@Der Martin</a> schlägt einen direkten Export zum SQL-Server vor, ich schlage eine direkte php-seitige Auswertung der Excel-Datei selbst anstelle ihres CSV-Exportes vor. Dort blieben die Zeilenumbrüche auch in ihrer "Zeile" und würden keine unerwartete CSV-Zeile erzeugen.</p> <blockquote> <p>Erst dann kam ich auf die Idee, je Zeile die Anzahl der Delimiter zu zählen. Es ging also danach um einen Ausbau der vorhandenen Lösung, die prinzipiell gut funktionierte.</p> </blockquote> <p>Nein, aus meiner Sicht geht es um ein konzeptionelles Problem, das der Umweg über eine CSV-Datei mit sich bringt. Würdest Du die Excel-Datei direkt parsen und auswerten, würde sich dieses Problem nicht stellen.</p> <blockquote> <p>Was bemängelst Du? Das eine csv-Datei nur 5 Spalten hat, eine andere aber 10? Und das ich im DB-Import alles nach Spalte 5 der csv in die db-Spalte namens "Bemerkungen" eintrage?</p> </blockquote> <p>Nein, dass Du uns die Beobachtungen nur häppchenweise lieferst. Man kann das auch gründlich zusammenfassen und in ein Posting stecken. Dann ist die Ursachenforschung auch wesentlich effektiver und eine Lösungsstrategie zielsicherer zu entwickeln. Wie z.B. dass Du den Umweg über CSV besser ganz lässt.</p> <blockquote> <p>Reinen Wein? Übertreibst Du nicht ein bißchen? </p> </blockquote> <p>Vielleicht. Aber nicht unberechtigterweise.</p> <blockquote> <p>Nochmal: Auf die Anzahl der Spalten der csv habe ich gar keinen Einfluß.</p> </blockquote> <p>Du hältst Dich an diesem CSV-Ergebnis fest wie ein Ertrinkender an einem Strohhalm. Deshalb drehen wir uns hier im Kreis! Natürlich hast Du jeden Einfluss, wenn Du die Excel-Datei selbst in eine CSV-Datei umwandelst! Vielleicht nur solltest Du die Feldinhalte in doppelte Anführungszeichen setzen lassen und beim CSV-Parsen darauf Rücksicht nehmen, damit nicht durch einen Zeilenumbruch in diesen Inhalten das CSV-Muster der x Zellen pro Zeile zerstört wird!</p> <blockquote> <p>Die db hat (z.b.) 5 notwendige Spalten.</p> </blockquote> <p>Das alles interessiert mich herzlich wenig. Mich interessiert lediglich der Datentransport von Excel nach PHP, weil die Daten von dort aus in die DB geschrieben werden.</p> <blockquote> <p>An diesem Modell kann ich nichts Falsches erkennen. Einzig könnte man darüber reden, ob ich die Bemerkungen normalisieren könnte. Muß man aber nicht.</p> </blockquote> <p>Das klingt doch einigermassen danach, als ob Du eben keine Hilfe wolltest, weil sie Deine gefasste Meinung über die ideale Lösung infrage stellt. Lag ich mit meinem Vorwurf also wirklich so falsch?</p> <blockquote> <p>Wie dem auch sei, ich hatte nie vor, hier irgendwen auszubeuten oder sonstwie unredlich zu sein. Und ich bin auch davon überzeugt, dass ich das nie gemacht habe, nicht mache und auch ganz sicher nicht machen werde!</p> </blockquote> <p>Dann ist ja gut. Ich kann den Thread ja weiter beobachten.</p> <blockquote> <p>Traurig genug, dass Du das anscheinend anders siehst/gesehen hast!</p> </blockquote> <p>So ganz alleine stehe ich mit dieser Beobachtung ja nicht da. Aber schauen wir doch, ob sich nicht doch ein besserer Lösungsansatz für Dein tatsächliches Problem "Umweg über CSV ist manchmal unzuverlässig" finden lässt. Nur musst Du es auch als solches akzeptieren, denn ohne eine solche Einsicht drehen wir uns hier weiter im Kreis.</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763209#m1763209 Rolf B 2020-01-19T22:16:36Z 2020-01-19T22:19:37Z Kritik an Deinem Umgang mit Hilfe <p>Hallo Pit,</p> <blockquote> <p>die inmitten eines feldes eines csv-Satzes einen zeilenumbruch hatte</p> </blockquote> <p>Falls dieses Feld in Anführungszeichen stand, dann sollte das etwas sein, das von fgetcsv behandelt wird. Jedenfalls ist das kein Grund, mittels Statistiken die häufigste Satzlänge zu ermitteln.</p> <p>In dem Fall wärest Du in die <a href="https://en.wikipedia.org/wiki/XY_problem" rel="nofollow noopener noreferrer">A-B (oder XY) Problem</a> Falle getappt.</p> <p>Ist das Problem "unterschiedliche Anzahl Felder" identisch mit dem Problem "Zeilenumbruch"? Mein Excel schließt Felder mit Zeilenumbruch, Feldtrennzeichen oder Anführungszeichen darin automatisch in Anführungszeichen ein, und Anführungszeichen im Feld werden verdoppelt gespeichert. Wird von fgetcsv alles transparent gehandhabt. Einsatz von fgetcsv wäre also die korrekte Problemlösung.</p> <p>Viele Datenbank-Import-Tools beherrschen Zeilenumbrüche in CSV Dateien nicht.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763216#m1763216 pl 2020-01-20T09:20:52Z 2020-01-20T09:20:52Z Kritik an Deinem Umgang mit Hilfe <p>Aha, so wie es sich jetzt darstellt, kommen die Daten aus einer DB/Tabelle. Da würde ich aber nicht erst in der CSV Datei versuchen die Duplikate zu bereinigen sondern genau das spätestens beim Datenexport tun. Das macht die Sache erheblich einfacher.</p> <p>MFG</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763416#m1763416 Raketenwissenschaftler 2020-01-23T10:10:45Z 2020-01-23T10:10:45Z Kritik an Deinem Umgang mit Hilfe <p>Ich kapier nicht ganz, was Du machst. Das ist für mich alles "von hinten durch die Brust ins Auge".</p> <ul> <li>Schritt 1:</li> </ul> <p>Exportiere aus Excel ganz normales CSV - <strong>just mit den von Excel vorgeschlagenen Optionen.</strong></p> <ul> <li>Schritt 2:</li> </ul> <p>Importiere das Zeug in die Datenbank, meinetwegen PHP. Beide können mit dem von Excel - <strong>bei Wahl der Standard-Optionen</strong> - geliefertem Zeug <strong>sehr gut</strong> umgehen.</p> <ul> <li>Beachte:</li> </ul> <p>Alles, was Dir Probleme bereitet sind die von Dir willkürliche gewählten Umwege. Da gibt es nämlich Ecken.</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763218#m1763218 pl 2020-01-20T09:55:04Z 2020-01-20T09:55:04Z Kritik an Deinem Umgang mit Hilfe <p><a href="/users/475" class="mention registered-user" rel="noopener noreferrer">@Der Martin</a></p> <p>einem Kunden erklären daß seine Daten/Dateien ungültig sind, dürfte erfahrungsgemäß schwierig werden: Weil es der Erwartungshaltung eines Kunden widerspricht.</p> <p>MFG</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763222#m1763222 Linuchs 2020-01-20T13:13:55Z 2020-01-20T13:13:55Z Zeilenumbruch in einem CSV-Feld <p>Hallo Martin,</p> <blockquote> <p>Abgesehen davon: Eine CSV-Datei, die an unpassender Stelle einen Zeilenumbruch hat, würde ich als ungültig abweisen.</p> </blockquote> <p>Mein Programm bekommt solche Dateien vom Kunden. Es muss doch zulässig sein, auch Daten aus der Feldart <code>textarea</code> mit Zeilenumbrüchen per CSV zu transportieren. Ja klar, da kann die CSV-Zeile zu früh enden und die nächste(n) Zeile(n) sind der Rest-Schrott.</p> <p>Da könnte man pro Zeile die CSV-Feldtrenner z.B. das <code>;</code> zählen. Wenn sie nicht reichen, den Zeilenumbruch von <code>\n</code> auf <code><br></code> ändern und die nächste(n) Zeile(n) anhängen.</p> <p>Gruß, Linuchs</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763217#m1763217 pl 2020-01-20T09:30:49Z 2020-01-20T09:30:49Z Kritik an Deinem Umgang mit Hilfe <blockquote> <p>Aha, so wie es sich jetzt darstellt, kommen die Daten aus einer DB/Tabelle. Da würde ich aber nicht erst in der CSV Datei versuchen die Duplikate zu bereinigen sondern genau das spätestens beim Datenexport tun. Das macht die Sache erheblich einfacher.</p> </blockquote> <p>Falls andersherum, CSV => DB:</p> <p>Die CSV-Datei in den Hauptspeicher lesen, dabei bekommen die Spalten Namen, eine dem enstprechende Stuktur sähe in etwa so aus:</p> <pre><code class="block">1: {name: foo, vname: bar}, 2: {name: dig, vname: dog} </code></pre> <p>usw. wobei 1, 2 einen Tupel eindeutig kennzeichnen. Um Redundanzen bestimmter Datenfelder rauszufiltern würde ich für die Tabelle dem entsprechende (eindeutige) Schlüsselfelder festlegen.</p> <p>MFG</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763219#m1763219 Tabellenkalk 2020-01-20T10:14:36Z 2020-01-20T10:14:36Z Kritik an Deinem Umgang mit Hilfe <p>Hallo,</p> <blockquote> <p>einem Kunden erklären daß seine Daten/Dateien ungültig sind, dürfte erfahrungsgemäß schwierig werden:</p> </blockquote> <p>Falls es hier tatsächlich zu einem Kundengespräch käme, wäre Pit sein eigener Kunde…</p> <p>Gruß<br> Kalk</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763220#m1763220 Der Martin 2020-01-20T10:20:50Z 2020-01-20T10:20:50Z Kritik an Deinem Umgang mit Hilfe <p>Hi,</p> <blockquote> <blockquote> <p>einem Kunden erklären daß seine Daten/Dateien ungültig sind, dürfte erfahrungsgemäß schwierig werden:</p> </blockquote> <p>Falls es hier tatsächlich zu einem Kundengespräch käme, wäre Pit sein eigener Kunde…</p> </blockquote> <p>so habe ich das auch verstanden.</p> <p>Aber was soll's, ich habe mir selbst auch schon hin und wieder gesagt: "Das ist aber Sch****, was du da gemacht hast."</p> <p>Ciao,<br>  Martin</p> <div class="signature">-- <br> Ich stamme aus Ironien, einem Land am sarkastischen Ozean. </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763223#m1763223 pl 2020-01-20T13:20:04Z 2020-01-20T13:20:04Z Kritik an Deinem Umgang mit Hilfe <p>Hallo,</p> <blockquote> <blockquote> <p>einem Kunden erklären daß seine Daten/Dateien ungültig sind, dürfte erfahrungsgemäß schwierig werden:</p> </blockquote> <p>Falls es hier tatsächlich zu einem Kundengespräch käme, wäre Pit sein eigener Kunde…</p> </blockquote> <p>Ja wenn das so ist, da frag ich mich natürlich warum es denn ausgerechnet eine CSV Datei sein muss. Zumal es für Datenexport /Datenimport auch in PHP einen Serializer gibt. Entscheidender als das Dateiformat ist die Frage wie man mit Feldern verfährt für die es keine Daten gibt: Sowas regelt man über's DB-Design. Ebenso ist die Frage wie man mit Duplikaten umgeht auch eine Frage des DB-Design.</p> <p>MFG</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763224#m1763224 MudGuard http://www.andreas-waechter.de/ 2020-01-20T13:38:03Z 2020-01-20T13:38:03Z Zeilenumbruch in einem CSV-Feld <p>Hi,</p> <blockquote> <p>Mein Programm bekommt solche Dateien vom Kunden. Es muss doch zulässig sein, auch Daten aus der Feldart <code>textarea</code> mit Zeilenumbrüchen per CSV zu transportieren.</p> </blockquote> <p>Natürlich. Es ist nur sehr naiv, anzunehmen, daß ein Datensatz (das, was in Excel einer Zeile entspricht) in einer CSV-Datei nur aus einer Zeile besteht.</p> <blockquote> <p>Da könnte man pro Zeile die CSV-Feldtrenner z.B. das <code>;</code> zählen.</p> </blockquote> <p>Wobei das Trennzeichen auch wieder im Feldinhalt vorkommen kann.</p> <blockquote> <p>Wenn sie nicht reichen, den Zeilenumbruch von <code>\n</code> auf <code><br></code> ändern und die nächste(n) Zeile(n) anhängen.</p> </blockquote> <p>Einfach einen CSV-Parser verwenden, der kümmert sich darum, daß Zeilenumbrüche oder Feldtrennzeichen oder Feldbegrenzer-Zeichen in Feldinhalten richtig berücksichtigt werden.</p> <p>cu,<br> Andreas a/k/a MudGuard</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763225#m1763225 Der Martin 2020-01-20T13:39:14Z 2020-01-20T13:39:14Z Zeilenumbruch in einem CSV-Feld <p>Hallo,</p> <blockquote> <blockquote> <p>Abgesehen davon: Eine CSV-Datei, die an unpassender Stelle einen Zeilenumbruch hat, würde ich als ungültig abweisen.</p> </blockquote> <p>Mein Programm bekommt solche Dateien vom Kunden.</p> </blockquote> <p>und wie geht das Programm damit um? Sind die Zeilenumbrüche irgendwie maskiert?</p> <blockquote> <p>Es muss doch zulässig sein, auch Daten aus der Feldart <code>textarea</code> mit Zeilenumbrüchen per CSV zu transportieren. Ja klar, da kann die CSV-Zeile zu früh enden und die nächste(n) Zeile(n) sind der Rest-Schrott.</p> </blockquote> <p>Ich bin mir gerade nicht sicher ... ich meine aber, dass ein Umbruch in CSV möglich ist, wenn die Zeile mit einem Backslash endet, der den Zeilenumbruch maskiert. Ist aber unüblich, und nur wenige Programme machen da mit.</p> <blockquote> <p>[...] den Zeilenumbruch von <code>\n</code> auf <code><br></code> ändern und die nächste(n) Zeile(n) anhängen.</p> </blockquote> <p>Wenn die erzeugende und die verarbeitende Software sich einig sind, kann man selbstverständlich auch eine übliche Escape-Sequenz wie z.B. \n verwenden. Dann muss man aber sicherstellen, dass wirklich alle beteiligten Programme damit zurechtkommen.</p> <p>Ciao,<br>  Martin</p> <div class="signature">-- <br> Ich stamme aus Ironien, einem Land am sarkastischen Ozean. </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763226#m1763226 pl 2020-01-20T14:17:04Z 2020-01-20T14:17:04Z Zeilenumbruch in einem CSV-Feld <blockquote> <blockquote> <p>Abgesehen davon: Eine CSV-Datei, die an unpassender Stelle einen Zeilenumbruch hat, würde ich als ungültig abweisen.</p> </blockquote> <p>Mein Programm bekommt solche Dateien vom Kunden. Es muss doch zulässig sein, auch Daten aus der Feldart <code>textarea</code> mit Zeilenumbrüchen per CSV zu transportieren.</p> </blockquote> <p>Der Zeilenumbruch einer <textarea> ist mit 0x0D 0x0A kodiert. Das ist also nicht nur ein \n sondern \r\n (2 Bytes, CRLF).</p> <p>MFG</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763255#m1763255 Rolf B 2020-01-21T07:49:54Z 2020-01-21T07:49:54Z Zeilenumbruch in einem CSV-Feld <p>Hallo Martin,</p> <p>mag sein, dass das mit Maskierungen funktioniert - aber mein Kenntnisstand ist, dass Felder mit ; oder \n darin in " gesetzt werden. Sollte im Feldinhalt ein " enthalten sein, wird der Inhalt in " engeschlossen und das " darin zu "" verdoppelt.</p> <p>Ersetze ; \n und " nach Bedarf durch die konkrete Ausprägung in der CSV Datei.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763230#m1763230 Felix Riesterer https://felix-riesterer.de 2020-01-20T15:29:11Z 2020-01-20T15:29:11Z Zeilenumbruch in einem CSV-Feld <p>Lieber pl,</p> <blockquote> <p>Der Zeilenumbruch einer <textarea> ist mit 0x0D 0x0A kodiert. Das ist also nicht nur ein \n sondern \r\n (2 Bytes, CRLF).</p> </blockquote> <p>das ist bei Windows so. <a href="https://de.wikipedia.org/wiki/Zeilenumbruch#Codierung_des_Zeilenumbruchs" rel="nofollow noopener noreferrer">Auf anderen Systemen nicht unbedingt.</a> Das solltest Du unbedingt dazu sagen, sonst erzählst Du nur <a href="https://www.zitate.eu/autor/simone-de-beauvoir-zitate/38885" rel="nofollow noopener noreferrer">die halbe Wahrheit</a>.</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763257#m1763257 Rolf B 2020-01-21T08:20:15Z 2020-01-21T08:26:04Z Zeilenumbruch in einem CSV-Feld <p>Hallo pl,</p> <p>innerhalb des Browsers ist ein Zeilenumbruch, dem man dort eingibt, stets ein \n (0x0a). Selbst dann, wenn man die Textarea mit Fremd-Linedelimitern bestückt:</p> <pre><code class="block language-js">document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">"foo"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>value <span class="token operator">=</span> <span class="token string">"Das ist ein Test\r\nEr ist die Pest\rEr gibt mir den Rest\n"</span><span class="token punctuation">;</span> </code></pre> <p>führt zum Hexdump (Chrome und Firefox unter Windows)</p> <pre><code class="block">44 61 73 20 69 73 74 20 65 69 6e 20 54 65 73 74 a 45 72 20 69 73 74 20 64 69 65 20 50 65 73 74 a 45 72 20 67 69 62 74 20 6d 69 72 20 64 65 6e 20 52 65 73 74 a </code></pre> <p>also jedesmal \n. Du kannst das <a href="https://jsfiddle.net/Rolf_b/px6cL07y/1/" rel="noopener noreferrer">hiermit</a> gerne unter Linux ausprobieren.</p> <p>Was PHP daraus macht, nachdem man einen solchen String zum Server gesendet hat, ist eine andere Frage.</p> <p>Update: Ich habe Christians Hinweis auf den Standard jetzt erst gesehen und bin nun verwirrt.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763231#m1763231 pl 2020-01-20T15:34:46Z 2020-01-20T15:34:46Z Zeilenumbruch in einem CSV-Feld <blockquote> <blockquote> <p>Der Zeilenumbruch einer <textarea> ist mit 0x0D 0x0A kodiert. Das ist also nicht nur ein \n sondern \r\n (2 Bytes, CRLF).</p> </blockquote> <p>das ist bei Windows so.</p> </blockquote> <p>Es ist generell so! MFG</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763234#m1763234 pl 2020-01-20T15:39:43Z 2020-01-20T15:39:43Z Zeilenumbruch in einem CSV-Feld <blockquote> <blockquote> <p>Der Zeilenumbruch einer <textarea> ist mit 0x0D 0x0A kodiert. Das ist also nicht nur ein \n sondern \r\n (2 Bytes, CRLF).</p> </blockquote> <p>das ist bei Windows so. <a href="https://de.wikipedia.org/wiki/Zeilenumbruch#Codierung_des_Zeilenumbruchs" rel="nofollow noopener noreferrer">Auf anderen Systemen nicht unbedingt.</a></p> </blockquote> <p>Der Artikel bezieht sich auf Textdateien. Also bitte richtig lesen, ich schrieb <textarea> und da ist 0D 0A (CRLF) der Zeilenumbruch.</p> <p>MFG</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763253#m1763253 Christian Kruse https://wwwtech.de/ 2020-01-21T06:10:23Z 2020-01-21T06:10:23Z Zeilenumbruch in einem CSV-Feld <p>Hallo Felix,</p> <blockquote> <blockquote> <p>Der Zeilenumbruch einer <textarea> ist mit 0x0D 0x0A kodiert. Das ist also nicht nur ein \n sondern \r\n (2 Bytes, CRLF).</p> </blockquote> <p>das ist bei Windows so. <a href="https://de.wikipedia.org/wiki/Zeilenumbruch#Codierung_des_Zeilenumbruchs" rel="nofollow noopener noreferrer">Auf anderen Systemen nicht unbedingt.</a> Das solltest Du unbedingt dazu sagen, sonst erzählst Du nur <a href="https://www.zitate.eu/autor/simone-de-beauvoir-zitate/38885" rel="nofollow noopener noreferrer">die halbe Wahrheit</a>.</p> </blockquote> <p>Nene. Da hat Rolf schon recht. Newlines in Textareas sind definiert als CR LF. <a href="https://dev.w3.org/html5/pf-summary/forms.html#the-textarea-element" rel="nofollow noopener noreferrer">Siehe auch den Standard</a>:</p> <blockquote> <p>The element's value is defined to be the element's raw value with the following transformation applied:</p> <ul> <li>Replace every occurrence of a U+000D CARRIAGE RETURN (CR) character not followed by a U+000A LINE FEED (LF) character, and every occurrence of a U+000A LINE FEED (LF) character not proceeded by a U+000D CARRIAGE RETURN (CR) character, by a two-character string consisting of a U+000D CARRIAGE RETURN - U+000A LINE FEED (CRLF) character pair.</li> <li>If the element's wrap attribute is in the Hard state, insert U+000D CARRIAGE RETURN - U+000A LINE FEED (CRLF) character pairs into the string using a UA-defined algorithm so that each line so that each line has no more than character width characters. The purposes of this requirement, lines are delimited by the start of the string, the end of the string, and U+000D CARRIAGE RETURN - U+000A LINE FEED (CRLF) character pairs.</li> </ul> </blockquote> <p>Schwierig wird es erst, wenn man das mit JS bearbeitet. Da gibt es dann wieder Plattform-Unterschiede… <code>/\n/</code> matcht in JS nicht immer auf den gleichen String, abhängig von Browser und OS, weshalb man dann doch wieder auf <code>/\r\n|\r|\n/</code> zurückgreifen muss.</p> <p>Freundliche Grüße,<br> Christian Kruse</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763258#m1763258 Rolf B 2020-01-21T08:22:55Z 2020-01-21T08:22:55Z Zeilenumbruch in einem CSV-Feld <p>Hallo Christian,</p> <p>das finde ich jetzt merkwürdig. Wenn die Textarea \r\n als Line Delimiter enthält, sind das doch definitiv 2 Zeichen. Und die habe ich bei einem Codepoint-by-Codepoint Dump des Content nicht gesehen - siehe hier [https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763257#m1763257].</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763256#m1763256 Der Martin 2020-01-21T08:08:05Z 2020-01-21T08:08:05Z Zeilenumbruch in einem CSV-Feld <p>Hallo Rolf,</p> <blockquote> <p>mag sein, dass das mit Maskierungen funktioniert - aber mein Kenntnisstand ist, dass Felder mit ; oder \n darin in " gesetzt werden.</p> </blockquote> <p>das eine hat IMO mit dem anderen nichts zu tun; außerdem empfehle ich, Felder mit Strings als Wert <strong>immer</strong> in Anführungszeichen zu setzen.</p> <blockquote> <p>Sollte im Feldinhalt ein " enthalten sein, wird der Inhalt in " engeschlossen und das " darin zu "" verdoppelt.</p> </blockquote> <p>Ja.</p> <blockquote> <p>Ersetze ; \n und " nach Bedarf durch die konkrete Ausprägung in der CSV Datei.</p> </blockquote> <p>Womit wir an einem wichtigen Punkt angekommen sind: Das CSV-Format ist sehr vage spezifiziert und lässt viele Freiheiten zu. Das macht es als universelles Austauschformat problematisch, weil jeder CSV-Parser (oder Generator) wieder geringfügig andere "Macken" hat.</p> <p>Frohes Schaffen,<br>  Martin</p> <div class="signature">-- <br> Ich stamme aus Ironien, einem Land am sarkastischen Ozean. </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763276#m1763276 pl 2020-01-21T09:31:11Z 2020-01-21T09:31:11Z Zeilenumbruch in einer textarea <p>Die Zeilenende-Controls macht der Browser, das hat mit PHP nichts zu tun. Das kannst Du selber prüfen indem Du im Formular einen Zeilenumbruch machst</p> <pre><code class="block language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>form</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>textarea</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>t<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>textarea</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span><span class="token punctuation">></span></span>...<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>form</span><span class="token punctuation">></span></span> </code></pre> <p>und dann guckst was nach dem Klick auf den Button in der Adresszeile steht: <code>?t=%0D%0A</code></p> <p>Davon abgesehen sollte der Transport von solchen Dingen wie Zeilenumbruchkodierung unabhängig sein. Da ist es schon ein bischen ungeschickt eine CSV Datei zu nehmen.</p> <p>MFG</p> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763261#m1763261 Christian Kruse https://wwwtech.de/ 2020-01-21T08:59:10Z 2020-01-21T08:59:10Z Zeilenumbruch in einem CSV-Feld <p>Hallo Rolf,</p> <blockquote> <p>das finde ich jetzt merkwürdig. Wenn die Textarea \r\n als Line Delimiter enthält, sind das doch definitiv 2 Zeichen. Und die habe ich bei einem Codepoint-by-Codepoint Dump des Content nicht gesehen - siehe hier [https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763257#m1763257].</p> </blockquote> <p>Ja, das ist Teil der Normalisierung für JS. Andere API Wenn du das Formular allerdings absendest, wirst du sehen, dass dort aus Zeilenumbrüchen <code>0x0D 0x0A</code> wird. Einfachstes Beispiel:</p> <pre><code class="block language-html"><span class="token doctype"><span class="token punctuation"><!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">html</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>html</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>head</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>title</span><span class="token punctuation">></span></span>Test<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>head</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>form</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>textarea</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>foo<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>textarea</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>submit<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>absenden<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>form</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>html</span><span class="token punctuation">></span></span> </code></pre> <p>Hier wirst du, wenn du in der Textarea einen Zeilenumbruch einfügst, sehen, dass im Query-String <code>foo=%0D%0A%0D%0A</code> auftaucht.</p> <p>Und ja, das ist alles konfus und verwirrend.</p> <p>Freundliche Grüße,<br> Christian Kruse</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763265#m1763265 Der Martin 2020-01-21T09:06:19Z 2020-01-21T09:06:19Z Zeilenumbruch in einem CSV-Feld <p>Hallo Christian,</p> <blockquote> <p>Hier wirst du, wenn du in der Textarea einen Zeilenumbruch einfügst, sehen, dass im Query-String <code>foo=%0D%0A%0D%0A</code> auftaucht.</p> </blockquote> <p>das wären schon <strong>zwei</strong> Zeilenumbrüche. Wo kommt der zweite her?</p> <blockquote> <p>Und ja, das ist alles konfus und verwirrend.</p> </blockquote> <p>Find' ich auch.</p> <p>Ciao,<br>  Martin</p> <div class="signature">-- <br> Ich stamme aus Ironien, einem Land am sarkastischen Ozean. </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763292#m1763292 Rolf B 2020-01-21T10:56:48Z 2020-01-21T10:56:48Z Zeilenumbruch in einem CSV-Feld <p>Hallo Christian,</p> <p>ok, offenbar sind Chrome und Firefox sich da einig, aber wenn man so durch StackOverflow streift, ist es in anderen Browsern wohl anders (gewesen). Angeblich auch im IE - aber nicht im IE11.</p> <p>Die weitere Frage ist dann, was ein WAMP und LAMP System daraus macht. Oder ein WIXP[^1] oder gar ein WISA[^2]</p> <p>[^1] Windows, IIS, (irgendeine DB), PHP [^2] Windows, IIS, MS SQL Server - da will ich kein X sehen, ASP.NET</p> <p>Bei LAMP würde ich eigentlich annehmen wollen, dass es aus \r\n einen standardisierten Unix-Linebreak \n macht. Kann ich aber nicht testen. Oder bin ich da gezwungen, die \r manuell zu entfernen falls ich den Text nach Unix-Standards weiterverarbeiten will?</p> <p>Bei WAMP dagegen, dass ich einen standardisierten Windows Linebreak \r\n bekomme, egal ob %0D%0A oder nur %0A über den Draht kommt. Das ist aber nicht so.</p> <p>D.h. mein PHP Programm kann davon ausgehen, dass es aus einer Textarea \r\n hereinbekommt, und muss das plattformkorrekt in Line Delimiters umsetzen. In der DB speichert man am besten noch \r\n, damit der ausgegebene Text zum eingegebenen passt, und formatiert es nur für externe Dateien um.</p> <p>Habichdasrichtigverstanden?</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763267#m1763267 Christian Kruse https://wwwtech.de/ 2020-01-21T09:08:52Z 2020-01-21T09:08:52Z Zeilenumbruch in einem CSV-Feld <p>Hallo Martin,</p> <blockquote> <blockquote> <p>Hier wirst du, wenn du in der Textarea zwei Zeilenumbrüche einfügst, sehen, dass im Query-String <code>foo=%0D%0A%0D%0A</code> auftaucht.</p> </blockquote> <p>das wären schon <strong>zwei</strong> Zeilenumbrüche. Wo kommt der zweite her?</p> </blockquote> <p>Wieso, ich schrieb doch von zwei Zeilenumbrüchen? </p> <p>Freundliche Grüße,<br> Christian Kruse</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763272#m1763272 Der Martin 2020-01-21T09:14:23Z 2020-01-21T09:14:23Z Zeilenumbruch in einem CSV-Feld <p>Hallo,</p> <blockquote> <blockquote> <blockquote> <p>Hier wirst du, wenn du in der Textarea zwei Zeilenumbrüche einfügst, sehen, dass im Query-String <code>foo=%0D%0A%0D%0A</code> auftaucht.</p> </blockquote> <p>das wären schon <strong>zwei</strong> Zeilenumbrüche. Wo kommt der zweite her?</p> </blockquote> <p>Wieso, ich schrieb doch von zwei Zeilenumbrüchen? </p> </blockquote> <p>hey, du schummelst! ;-)<br> Ich spiel nicht mehr mit, gebt mir meinen Teddy wieder!</p> <p>Ciao,<br>  Martin</p> <div class="signature">-- <br> Ich stamme aus Ironien, einem Land am sarkastischen Ozean. </div> https://forum.selfhtml.org/self/2020/jan/16/csv-datei-von-duplikaten-befreien/1763293#m1763293 Christian Kruse https://wwwtech.de/ 2020-01-21T11:11:34Z 2020-01-21T11:11:34Z Zeilenumbruch in einem CSV-Feld <p>Hallo Rolf,</p> <blockquote> <p>ok, offenbar sind Chrome und Firefox sich da einig, aber wenn man so durch StackOverflow streift, ist es in anderen Browsern wohl anders (gewesen). Angeblich auch im IE - aber nicht im IE11.</p> </blockquote> <p>Ja, in vergangenen Zeiten war das Kraut und Rüben. Das ist der Ist-Zustand bereits eine Verbesserung.</p> <blockquote> <p>Bei LAMP würde ich eigentlich annehmen wollen, dass es aus \r\n einen standardisierten Unix-Linebreak \n macht. Kann ich aber nicht testen.</p> </blockquote> <p>Ich kann nicht für alle PHP-Versionen sprechen, aber bei allen mir bekannten Versionen bleibt bei einem LAMP-System das CR LF erhalten.</p> <blockquote> <p>Oder bin ich da gezwungen, die \r manuell zu entfernen falls ich den Text nach Unix-Standards weiterverarbeiten will?</p> </blockquote> <p>Ja.</p> <blockquote> <p>D.h. mein PHP Programm kann davon ausgehen, dass es aus einer Textarea \r\n hereinbekommt, […]</p> </blockquote> <p>Nein. Du kannst nicht davon ausgehen, denn nicht alle Requests werden von modernen Browsern ausgeführt. Du musst normalisieren. Ich mache das hier im Forum auch:</p> <pre><code class="block language-elixir"><span class="token module class-name">Enum</span><span class="token punctuation">.</span><span class="token function">reduce</span><span class="token punctuation">(</span>str_changes<span class="token punctuation">,</span> changeset<span class="token punctuation">,</span> <span class="token keyword">fn</span> key<span class="token punctuation">,</span> changeset <span class="token operator">-></span> <span class="token module class-name">Ecto</span><span class="token punctuation">.</span><span class="token module class-name">Changeset</span><span class="token punctuation">.</span><span class="token function">update_change</span><span class="token punctuation">(</span>changeset<span class="token punctuation">,</span> key<span class="token punctuation">,</span> <span class="token operator">&</span><span class="token module class-name">Regex</span><span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex">~r/\015\012|\015|\012/</span><span class="token punctuation">,</span> <span class="token argument variable">&1</span><span class="token punctuation">,</span> <span class="token string">"\n"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">end</span><span class="token punctuation">)</span> </code></pre> <blockquote> <p>und muss das plattformkorrekt in Line Delimiters umsetzen.</p> </blockquote> <p>Ja.</p> <blockquote> <p>In der DB speichert man am besten noch \r\n, damit der ausgegebene Text zum eingegebenen passt, und formatiert es nur für externe Dateien um.</p> <p>Habichdasrichtigverstanden?</p> </blockquote> <p>Ich handhabe das anders. Ich speichere in der Datenbank immer nur Unix line endings. Wenn notwendig, konvertiere ich dann in das benötigte Format.</p> <p>Freundliche Grüße,<br> Christian Kruse</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div>