tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von genodeftest
  • 1 Beitrag von schnuffie
ERLEDIGT
JA
ANTWORTEN
13
ZUGRIFFE
709
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Hallo Community,

    ich stehe momentan vor foglendem Problem. Ich muss aus einem String (eingescannte Dokumente mit ~200 Seiten) alle nicht darstellbaren Zeichen entfernen.
    Mein Ansatz war es nun, über den String bzw. jedes Zeichen zu iterieren und auf ein nicht darstellbares Zeichen prüfen. Da das aber bei einem String, der aus einem ~200 Seiten Dokument entstanden ist, sehr schlechte Performance erziehlen dürfte ist wohl klar.
    Deshalb bin ich noch weiterhin auf der Suche nach einem vernünftigen Ansatz für dieses Problem. Vielleicht hat jemand von euch das gleiche schon mal gemacht oder hat einen Denkanstoß für mich. Würde mich freuen.

    Gruß

    Fabio
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  2. #2
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    Registriert seit
    Jun 2007
    Ort
    Passau (Niederbayern)
    Beiträge
    1.394
    Hi,

    lies die Datei nicht komplett in den Arbeitsspeicher, sondern in Häppchen.
    Iteriere durch den Block und kopiere alle lesbaren Zeichen in einen StringBuilder, alle nicht darstellbaren Zeichen werden somit entfernt.
    Schreibe den Inhalt des StringBuilders in eine andere Datei. Somit dürfte sich der Arbeitsspeicherbedarf verringern und die Performance steigen.

    Das wäre mein Ansatz

    Gruß
    BK
     
    Über eine gute Bewertung freut sich jeder ;)
    Bitte erledigte Threads als "Erledigt" markieren.

    "Though a program be but three lines long, someday it will have to be maintained.''
    -- Geoffrey James, "The Tao of Programming"

  3. #3
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Hi Bratkartoffel,

    gut das du mir das mit dem Arbeitsspeicher gesagt hast, da hät ich selber fast nicht mehr dran gedacht.
    Das Problem dabei ist nur, dass ich den Dokumenteninhalt in einer Mail verschicken will (sowohl als Attachment als auch als Text). Und den Text setze ich so:
    Code java:
    1
    2
    
    MimeBodyPart contentBody = new MimeBodyPart();
    contentBody.setText(content);
    Soweit ich weiß gibt es da auch keine andere Möglichkeit, den Text einer E-Mail in "Häppchen" zu setzen. Aber wenn du da mehr weißt als ich, dann würde es mich freuen wieder etwas neues zu lernen.

    Zitat Zitat von Bratkartoffel Beitrag anzeigen
    Iteriere durch den Block und kopiere alle lesbaren Zeichen in einen StringBuilder, alle nicht darstellbaren Zeichen werden somit entfernt.
    Das klingt super! Genau so würde ich es auch machen. Die Frage ist nur, wie erkenne ich, ob es ein darstellbares Zeichen ist oder nicht? Und wie erkenne ich das, ohne dass ich über jedes Zeichen einzeln iterieren muss?

    Gruß

    Fabio
    Geändert von Fabio Hellmann (02.12.11 um 13:55 Uhr) Grund: Es heißt natürlich darstellbar und nicht lesbares Zeichen
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  4. #4
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    Registriert seit
    Jun 2007
    Ort
    Passau (Niederbayern)
    Beiträge
    1.394
    Hi,

    hier kann ich dir leider nicht mehr helfen, das übersteigt meine Kenntnisse

    Gruß
    BK
     
    Über eine gute Bewertung freut sich jeder ;)
    Bitte erledigte Threads als "Erledigt" markieren.

    "Though a program be but three lines long, someday it will have to be maintained.''
    -- Geoffrey James, "The Tao of Programming"

  5. #5
    genodeftest genodeftest ist offline Mitglied Brillant
    Registriert seit
    Jun 2009
    Beiträge
    870
    Zitat Zitat von Fabio Hellmann Beitrag anzeigen
    Die Frage ist nur, wie erkenne ich, ob es ein lesbares Zeichen ist oder nicht?
    Du meinst wahrscheinlich darstellbare Zeichen oder?
    Die Erkennung dürfte sich ziemlich schwer gestalten, weil die Darstellbarkeit von Zeichen von folgenden Parametern abhängt:
    • verwendeter Zeichensatz (Ok, du hast es auf UTF-8 eingegrenzt, aber auch da gibt es mehrere Möglichkeiten bei der Zusammensetzung von Zeichen, die größer als ein Byte sind)
    • auf dem Zielsystem installierte Schriftarten
    • verwendete Schrift (Webdings, Wingdings nutzen völlig andere Zeichen)
    • verwendetes Alphabet (z.B. kyrillische, arabische, lateinische, koreanische, ... Schriftzeichen)
    • Sprachspezifische Zeichen (z.B. mit Akzenten)
    • erlaubte Sonderzeichen (z.B. Anführungszeichen „ “ ” " ' ’ ‘ ‚ ; schmale, geschützte und schmale geschützte Leerzeichen, die verschiedenen Geviertstriche ( https://de.wikipedia.org/wiki/- ), Gedankenstrich, Minus, Plus, das Zeichen für 3 Punkte: …; …)
    • zusammengesetzte Schriftzeichen (z.B. aus lateinischen Buchstaben und Akzent/Tilde/... wobei beide in separaten Chars gespeichert werden)
    Zitat Zitat von Fabio Hellmann Beitrag anzeigen
    Und wie erkenne ich das, ohne dass ich über jedes Zeichen einzeln iterieren muss?
    Selbst wenn du nur ein paar einfache Zeichen (Groß- und Kleinbuchstaben des lateinischen Alphabets, evtl. Umlaute, Satzzeichen und Leerzeichen) zulässt, wird dir nichts anderes übrig bleiben, als über jedes einzelne Zeichen zu iterieren. Es gibt keine einfachere Möglichkeit.
    Performancetipps:
    • Ausführung parallelisieren (hoher Aufwand, Erfolg hängt von der verwendeten Hardware ab)
    • Nur wenn du mit einer Whitelist arbeitest: Buchstaben nach absteigender Häufigkeit sortieren, d.h. häufige Buchstaben wie 's' oder 'e' sollten zuerst überprüft werden.

    Prinzipiell würde ich dir davon abraten, so etwas umzusetzen (wenn es nicht unbedingt sein muss)
    Fabio Hellmann bedankt sich. 
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  6. #6
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Danke ersteinmal für die ausführliche Antwort genodeftest.

    Ich bin gerade eben noch über die Methode trim() von String gestoßen. Und so wie es scheint macht diese Methode genau das, was ich haben will. Ob es wirklich zu 100% stimmt, kann ich (noch) nicht genau sagen.

    Gruß

    Fabio
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  7. #7
    Avatar von HonniCilest
    HonniCilest HonniCilest ist offline Mitglied Platin
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    501
    Ich würde an deiner Stelle replace-Methoden verwenden, welche mit regex arbeiten. So gibt es bei regex z.B. die vordefinierte Zeichenklasse:
    \w - wordcharacter - ein Buchstabe, eine Ziffer oder der Unterstrich, also [a-zA-Z_0-9] (und evtl. weitere Buchstaben, z. B. Umlaute)
    Negieren und fertig.
     
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

  8. #8
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Hi HonniCilest,
    das habe ich auch schon ausprobiert. Das Ergebnis war aber nicht befriedigend, da ich nicht weiß, welche Zeichen ein Dokument enthält und welche nicht. Daher find ich die momentane Lösung mit "string.trim()" immer noch am Besten.
    Aber drotzdem danke für deinen Vorschlag.

    Gruß

    Fabio
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  9. #9
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    Registriert seit
    Jun 2007
    Ort
    Passau (Niederbayern)
    Beiträge
    1.394
    Hi,

    soweit ich weiß schneidet trim() nur Leerzeichen am Anfang und Ende eines Strings weg?

    Gruß
    BK
     
    Über eine gute Bewertung freut sich jeder ;)
    Bitte erledigte Threads als "Erledigt" markieren.

    "Though a program be but three lines long, someday it will have to be maintained.''
    -- Geoffrey James, "The Tao of Programming"

  10. #10
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Ja das dachte ich bisher auch immer. Steht schließlich auch so in der API. Allerdings bin ich in den apache commons lang in der Klasse StringUtils bei der Methode StringUtils.trim(String) ein wenig stutzig geworden, da da folgendes steht:
    trim

    public static String trim(String str)

    Removes control characters (char <= 32) from both ends of this String, handling null by returning null.

    The String is trimmed using String.trim(). Trim removes start and end characters <= 32. To strip whitespace use strip(String).

    To trim your choice of characters, use the strip(String, String) methods.

    StringUtils.trim(null) = null
    StringUtils.trim("") = ""
    StringUtils.trim(" ") = ""
    StringUtils.trim("abc") = "abc"
    StringUtils.trim(" abc ") = "abc"


    Parameters:
    str - the String to be trimmed, may be null
    Returns:
    the trimmed string, null if null String input
    Und wenn man mal in den Code von dieser Methode reinschaut, dann steht da nur folgendes drin:
    Code java:
    1
    2
    3
    
    public static String trim(String str) {
        return str == null ? null : str.trim();
    }
    D.h. String.trim() schneidet nicht nur die Leerzeichen weg. Und da in diesem Bereich von "char <= 32" die meisten (nicht alle) nicht darstellbaren Zeichen enthalten sind, funktioniert das.

    So würde ich es mir zumindest erklären. Kann auch sein, dass ich falsch liege. Wenn ja, würde ich mich über eine Aufklärung freuen.

    Gruß

    Fabio
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  11. #11
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    Registriert seit
    Jun 2007
    Ort
    Passau (Niederbayern)
    Beiträge
    1.394
    Hi,

    wie in dem JavaDoc Kommentar steht:
    from both ends of this String
    Er entfernt nur die Kontrollzeichen am Anfang und Ende des Strings. Falls in der Mitte welche vorkommen, Pech gehabt

    Gruß
    BK
     
    Über eine gute Bewertung freut sich jeder ;)
    Bitte erledigte Threads als "Erledigt" markieren.

    "Though a program be but three lines long, someday it will have to be maintained.''
    -- Geoffrey James, "The Tao of Programming"

  12. #12
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    Ich versuch mal eine andere Herangehensweise an das Problem. Was sind das für Zeichen die nicht darstellbar sind? Du redest von eingescannten Dokumenten. Wie kommst du da an den Text?
    Ist der Zeichensatz des Textes, denn du versuchst einzulesen ein anderer, den du vlt explizit angeben musst?
    Wenn es sich nicht gerade um chinesische Zeichen handelt sollte man davon ausgehen, dass UTF-8 diese beschreiben kann. Strings in Java kann alles, da es auf UTF-16 basiert.
     
    Wäre super wenn ihr euren Code in dieser Form einfügt:
    Code java:
    1
    
    System.out.println("Hello World");
    [java]System.out.println("Hello World");[/java]
    Für erledigte Threads dürft ihr den "erledigt"-Button anklicken!
    Über Dank freut sich jeder, der euch geholfen hat - ein Klick auf "Danke" kostet ja nicht mal was
    Blog: http://javaeffective.wordpress.com/

  13. #13
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    @Bratkartoffel:
    Komischer Weiße sind die nicht darstellbaren Zeichen auch nur am Anfang und am Ende gewesen.

    @Anime-Otaku:
    Die Dokumente werden nach dem Scannvorgang durch ein Texterkennungsprogramm gejagd. Das dieses nicht zu 100% richtig liegen kann ist mir bewusst, da die Dokumente teilweiße eine sehr schlechte Qualität haben.
    Meines Erachtens nach, sind die Dokumente entweder auf Deutsch oder Englisch.
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  14. #14
    Avatar von schnuffie
    schnuffie schnuffie ist offline Mitglied Platin
    Registriert seit
    Oct 2004
    Ort
    Ober-Roden (Hessen)
    Beiträge
    725
    Falls Du den Zeichensatz des Gescannten kennst, kannst Du die Umwandelfunktionen von String verwenden:
    new String("test".getBytes(), "UTF-8")
    new String("test".getBytes("UTF-8"))
    Fabio Hellmann bedankt sich. 
    CU schnuffie

    Fragliche Fragen stellende Fragensteller sind für verantwortungslose Antworten antwortender verantwortlicher Antworter selbst verantwortlich.

Ähnliche Themen

  1. Letztes Zeichen entfernen
    Von dezz im Forum PHP
    Antworten: 3
    Letzter Beitrag: 26.06.10, 01:56
  2. Antworten: 2
    Letzter Beitrag: 30.09.09, 19:31
  3. Sinnfreie Zeichen in CSV entfernen
    Von Moritz123 im Forum PHP
    Antworten: 6
    Letzter Beitrag: 25.08.08, 12:19
  4. Nicht utf8 Zeichen aus String entfernen
    Von Templorials im Forum PHP
    Antworten: 6
    Letzter Beitrag: 10.09.07, 19:39
  5. zeichen aus zeichenkette entfernen
    Von cent im Forum PHP
    Antworten: 4
    Letzter Beitrag: 30.12.01, 21:02