Welche Programmiersprache

  • Hallo,

    ich habe folgendes Problem:
    Ich muss aus einer Tabelle (95 Spalten/100.000 Zeilen) doppelte Einträge löschen, wobei es hier Fallunterscheidungen gibt. Z.B. kann es sein, dass in 80 Spalten nichts steht, dann wird der Datensatz übernommen wo was drin steht, usw....
    Da jede Spalte miteinander verglichen werden muss, möchte ich keine DB-Abfrage machen, sondern einen Algorithmus schreiben. Das Programm sollte ohne großartigen Aufwand (Installationen) auf jedem Rechner laufen und eine gute Laufzeit haben. Weiters ist die einzulesende Datei im CSV-Format.
    Bin leider ein bissi ratlos und deshalb über jeden Ratschlag dankbar!
    Lg, daniela

  • ich würde als sprachen c# oder java empfehlen - die sprachen werden aber nur sekundären einfluss auf deine laufzeit haben...

    mit einem fertigen Algorithmus kann ich leider nicht dienen:
    Als Idee könnt ich mir vorstellen, dass du ZeilenSummen bildest (also jedem Zeichen einen Wert zuordnen und das dann aufsummieren) - dann hättest du nach einem kompletten durchlauf mal alle Zeilen die miteinander verglichen werden sollten (da es ein mögliches - aber natürlich kein hinreichendes Indiz für ein Duplikat ist)
    hab aber keine ahnung wie performant das ist - müsste mal testen - sollte ein implementierungsaufwand von ca 1-2h sein :)

    lg
    wolfgang

    -------------------
    “If you hear hoof beats, you should look for horses, not zebras.”
    --
    "You, Sir, are an Idiot!" - George Hamilton

  • Zitat von daniela

    Ich muss aus einer Tabelle (95 Spalten/100.000 Zeilen) doppelte Einträge löschen, wobei es hier Fallunterscheidungen gibt. Z.B. kann es sein, dass in 80 Spalten nichts steht, dann wird der Datensatz übernommen wo was drin steht, usw....

    ist die tabelle teil einer richtigen datenbank, oder hast du mit db-anfrage etwas wie den sql-zugriff in access gemeint? wenn es eine richtige datenbank ist, wie wäre es denn mit einer stored procedure (pl/sql)? das testen ist zwar etwas mühsam, und wie da die performance genau ist, weiß ich nicht, aber es sollte für so etwas geeignet sein denke ich.. habe aber zu wenig erfahrung mit datenbanken, um sagen zu können, ob das wirklich die beste lösung wäre..

    lg michi

  • Es ist ein CSV-File, dass man in Excel, Access usw. öffnen kann. Bekomm es leider so und hab mit den Abfragen davor nichts zu tun. Mit sql mag ich es nicht lösen, da es nicht wirklich sinnvoll ist (aus meiner Sicht), weil ich eben jede Spalte anschauen muss und es zuviele Fallunterscheidungen gib....
    Danke aber trotzdem!
    Lg, daniela

  • Zitat von daniela

    Es ist ein CSV-File, dass man in Excel, Access usw. öffnen kann. [...]

    entschuldige bitte, da war ich wieder mal zu voreilig, hatte ich glatt überlesen.

    pl/sql wäre ja auch nicht reines sql gewesen, sondern eine richtige programmiersprache, die direkt auf einer oracle-datenbank arbeitet. geht natürlich nur, wenn man eine oracle-db hat :rolleyes:

    wenn du schnelle ergebnisse (kurze entwicklungszeit) und hohe wartbarkeit willst, kann ich mich wolfmann nur anschließen.. c# ist halt noch ein bisschen windows-behaftet (aber IMO eine tolle sprache), das java-programm würde auf jeden fall auch auf vielen anderen architekturen laufen.

    lg michi

  • Ich würde für so eine aufgabe keine statisch getypte sprache wie java oder c# empfehlen, sondern eine 'scriptsprache' (was immer dieses wort auch bedeuten mag)

    Grund dafür ist einfach, dass solche sprachen von haus aus über starke möglichkeiten zur textverarbeitung verfügen und die entwicklungszeit wesentlich kürzer wird.

    die sprachen ruby, python und perl sind (z.b) alle sehr gut dafür geeignet.
    ruby und python sind sehr elegant, perl vermutlich am performantesten. Allerdings denke ich nicht dass die sprache hier so grosse auswirklungen auf die laufzeit hat, das es wirklich relevant für dich wird.

    ein grober ansatz, um in ruby doppelte zeilen rauszufiltern (ohne leere columns zu berücksichtigenb usw.) sähe z.b so aus:

    Code
    lines = []
    IO.readlines("t.csv").each do |line|
      unless lines.include? line 
        print line 
        lines << line
      end
    end

    oder in python:

    Code
    lines = []
    for line in open('t.csv'):
        if not line in lines:
            print line
            lines.append(line)

    das allein wäre in java oder c# schon um einiges aufwendiger und unübersichtlicher zu implementieren.

  • Zitat von a9bejo

    Ich würde für so eine aufgabe keine statisch getypte sprache wie java oder c# empfehlen, sondern eine 'scriptsprache' (was immer dieses wort auch bedeuten mag)

    Grund dafür ist einfach, dass solche sprachen von haus aus über starke möglichkeiten zur textverarbeitung verfügen und die entwicklungszeit wesentlich kürzer wird.


    Sehe ich ziemlich ähnlich, obwohl ein handgeschriebener Parser in C auch seine schönen - wenn auch unlesbaren - Seiten hat.

    Zitat von a9bejo

    ein grober ansatz, um in ruby doppelte zeilen rauszufiltern (ohne leere columns zu berücksichtigenb usw.) sähe z.b so aus:

    Code
    lines = []
    IO.readlines("t.csv").each do |line|
      unless lines.include? line 
        print line 
        lines << line
      end
    end

    oder in python:

    Code
    lines = []
    for line in open('t.csv'):
        if not line in lines:
            print line
            lines.append(line)

    das allein währe in java oder c# schon um einiges aufwendiger und unübersichtlicher zu implementieren.


    Der gepflegte Unix-Mensch würde dafür ja einfach

    Code
    sort | uniq

    schreiben ;)

    Ansonsten erscheint mir "awk" recht gut für solche Aufgaben geeignet zu sein. Obwohl klassisches Unix-Tool, gibt es auch einen Windows-Ports dafür. In wie weit das aber der geforderten simplen Installation widerspricht will ich nicht beurteilen.

    Why bother spending time reading up on things? Everybody's an authority, in a free land.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!