Wie Duplikate in Datei löschen?



  • Wie kann ich das am besten umsetzen?
    Sollte ich eine Datei haben mit ungefähr sagen wir mal 10000 Zeilen wird es ja ewig dauern die doppelten Einträge raus zu löschen.
    Bin leider noch Anfänger was die Programmiersprache C angeht und benötige leider wohl doch noch etwas mehr Hilfe als gedacht..



  • Hybrid schrieb:

    Wie kann ich das am besten umsetzen?
    Sollte ich eine Datei haben mit ungefähr sagen wir mal 10000 Zeilen wird es ja ewig dauern die doppelten Einträge raus zu löschen.
    Bin leider noch Anfänger was die Programmiersprache C angeht und benötige leider wohl doch noch etwas mehr Hilfe als gedacht..

    Du kannst dir einen Hashwert aus deinen Fragen bilden.
    Diesen Wert speicherst du zusammen mit der Datei-Position in einem Array/Liste/Baum. Dann brauchst du nur noch nach dem Hashwert suchen (und bei Gleichheit noch ein strcmp an der Fileposition)

    Du kannst ja mal als Hashfunktion die Summe der Zeichnen (verknüpft mit strlen) nehmen.



  • Ok ich schreibe also erst alle Fragen:Antworten in eine Temporäre Textdatei öffne diese Datei dann und lese Zeile für Zeile ein erstelle einen Hashwert speichere die Hashwerte in einem Array und überprüfe dann die Werte innerhalb des Arrays sollte ein Wert doppelt sein schreibe ich diese Zeile nicht in die endgültige Textdatei, wäre das so korrekt?
    Oder gibt es noch einen schnelleren/effiktivren Weg?
    Weil bei 10000 bis 20000 Fragen kann das doch schon so seine Gewisse Zeit dauern oder...



  • Lasse den Hashkram erstmal weg, probiere die einfache Lösung, halbwegs moderne Hardware hat auch mit 10000 Strings keine Performanzprobleme.



  • Zum hasch algo: Hab mit Adler-32 gute Erfahrungen gemacht als ich nach einem einfachen und schnellen gesucht habe.

    http://de.wikipedia.org/wiki/Adler-32



  • Hybrid schrieb:

    Oder gibt es noch einen schnelleren/effiktivren Weg?

    Du kannst Shellscripte verwenden.
    Das in Perl versuchen zu schreiben.
    Nimm eine Datenbank. Z.B. sqlite,
    (Die verwendet Firefox für die Lesezeichenverwaltung/History, mit einem Addon kannst du eine sqlite dB auch mit Firefox verwalten)



  • Lasse den Hashkram erstmal weg, probiere die einfache Lösung, halbwegs moderne Hardware hat auch mit 10000 Strings keine Performanzprobleme.

    Wie würde den die einfache Lösung aussehen ??
    Ich kann ja nicht alle Fragen:Antworten in nem Array speichern, ausserdem bräuchte ich doch dann eine Art "Stringtabelle" oder?
    Mir fällt ohne Hashwert keine möglichkeit ein wie ich das am besten/einfachsten lösen kann..



  • Wie willst du die Fragen denn später verwenden?
    Wie werden die denn da verarbeitet?



  • Die Fragen werden später von einem anderem Programm mit Benutzeroberfläche für ein Quiz verwendet.
    Wollte nur eine Software in C schreiben das doppelte Zeilen löscht...
    Muss sich ja nicht jetzt zwingend um Fragen/Antworten halten könnten ja auch z.B Namen oder so sein..
    Geht mir eigentlich nur darum doppelte Zeilen zu löschen. Den Ansatz mit den Hashwerten fand ich ganz gut, aber da es ja noch einen "einfacheren" Weg geben soll würde der mich doch auch interessieren...



  • Hashes nimmt man, wenn es auf die letzte Millisekunden und/oder das letzte Byte Hauptspeicher ankommt.
    Außerdem für Anfänger ziemlich fehleranfällig, es hindert dich ja keiner daran, anschließend, wenn dein Standardanwendungsfall läuft nochmal zu optimieren.

    int schonDa(char **a,size_t z,char *s)
    {
      while( z-- )
        if( !strcmp(a[z],s) )
          return 1;
      return 0;
    }
    
    int main()
    {
      FILE *f=fopen("blafasel.txt","r");
      char **strarray=0, zeile[100];
      size_t z=0;
    
      while( fgets(zeile,100,f) )
      {
        if( !schonDa(strarray,z,zeile) )
          strarray=realloc(strarray,++z*sizeof*strarray),strcpy(strarray[z-1]=malloc(100),zeile);
      }
    
      while( z-- )
        puts(strarray[z]),free(strarray[z]);
      free(strarray);
      fclose(f);
      return 0;
    }
    

Anmelden zum Antworten