2Danke
ERLEDIGT
JA
JA
ANTWORTEN
13
13
ZUGRIFFE
709
709
EMPFEHLEN
-
02.12.11 12:18 #1
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ß
FabioBitte 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.
-
02.12.11 12:49 #2
- 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"
-
02.12.11 12:58 #3
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:
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.Code java:1 2
MimeBodyPart contentBody = new MimeBodyPart(); contentBody.setText(content);
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ß
FabioGeä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.
-
02.12.11 13:11 #4
- 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"
-
02.12.11 13:47 #5
- Registriert seit
- Jun 2009
- Beiträge
- 870
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)
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)Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
-
02.12.11 14:11 #6
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ß
FabioBitte 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.
-
02.12.11 14:27 #7
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.
-
02.12.11 15:07 #8
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ß
FabioBitte 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.
-
02.12.11 17:47 #9
- 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"
-
02.12.11 19:30 #10
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:
Und wenn man mal in den Code von dieser Methode reinschaut, dann steht da nur folgendes drin: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
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ß
FabioBitte 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.
-
05.12.11 10:28 #11
- Registriert seit
- Jun 2007
- Ort
- Passau (Niederbayern)
- Beiträge
- 1.394
Hi,
wie in dem JavaDoc Kommentar steht:
Er entfernt nur die Kontrollzeichen am Anfang und Ende des Strings. Falls in der Mitte welche vorkommen, Pech gehabtfrom both ends of this String
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"
-
05.12.11 12:48 #12
- 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:
[java]System.out.println("Hello World");[/java]Code java:1
System.out.println("Hello World");
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/
-
06.12.11 15:42 #13
@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.
-
11.12.11 15:27 #14
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"))CU schnuffie
Fragliche Fragen stellende Fragensteller sind für verantwortungslose Antworten antwortender verantwortlicher Antworter selbst verantwortlich.
Ähnliche Themen
-
Letztes Zeichen entfernen
Von dezz im Forum PHPAntworten: 3Letzter Beitrag: 26.06.10, 01:56 -
In einem String die ersten X Zeichen entfernen - dabei NICHT Wörter zerstören
Von Kristian im Forum PHPAntworten: 2Letzter Beitrag: 30.09.09, 19:31 -
Sinnfreie Zeichen in CSV entfernen
Von Moritz123 im Forum PHPAntworten: 6Letzter Beitrag: 25.08.08, 12:19 -
Nicht utf8 Zeichen aus String entfernen
Von Templorials im Forum PHPAntworten: 6Letzter Beitrag: 10.09.07, 19:39 -
zeichen aus zeichenkette entfernen
Von cent im Forum PHPAntworten: 4Letzter Beitrag: 30.12.01, 21:02





Zitieren


Login





