Hallo, ich lese eine Datei zeilenweise in ein String ein. Im String sind dann auch Steuerzeichen und ?/ ... Wie filtere ich die raus? Es sollen nur 0...9 sowie A...Z bzw a...z vorkommen dürfen. Grüßle Steve_O
Zum Beispiel regulaere Ausdruecke benutzen, etwa java.util.regex aber gibt auch noch mehr mit regular expressions.
Ich kann kein Java. Vielleicht hilft Dir folgendes an C angelehnte Codebeispiel bool Filtere_Zeichen (char x) { if (x >= '0') and (x <= '9') then return true; if (x >= 'A') and (x <= 'Z') then return true; if (x >= 'a') and (x <= 'z') then return true; return false; }
Die Klasse die du brauchst heißt FilterReader. Du erzeugst eine neue Klasse und vererbst alle Eigenschaften von FilterReader. Dann überschreibst du die Methode "read".
1 | /*Anlegen des Readers. LineFeedFilter löscht Zeilenumbrüche in Spalten.*/
|
2 | BufR = new BufferedReader(new LineFeedFilter(new FileReader(Dateiname))); |
Ich habe mal einen Filter gebraucht, der mir Linefeeds herausfiltert wenn keine Carriage Return davor kommt. Hier ist er:
1 | public class LineFeedFilter extends FilterReader |
2 | {
|
3 | private int iLastSymbol=0; |
4 | |
5 | |
6 | /**
|
7 | * Konstruktor ruft den Konstruktor der Vaterklasse auf
|
8 | * @param in Datenstrom vom Typ Reader
|
9 | */
|
10 | public LineFeedFilter(Reader in) |
11 | {
|
12 | super(in); |
13 | }
|
14 | |
15 | /**
|
16 | * Liest ein einziges Zeichen aus dem Datenstrom und filtert Linefeeds dann heraus,
|
17 | * wenn das Zeichen davor kein Carriage Return war
|
18 | * @return gibt den ASCII-Code als int zurück
|
19 | */
|
20 | public int read() throws IOException |
21 | {
|
22 | /*Symbol lesen: */
|
23 | int iSymbol = in.read(); |
24 | /*Wenn das gelesene Symbol ein LineFeed ist:*/
|
25 | if (iSymbol == 10) |
26 | {
|
27 | /*Wenn das letzte Symbol ein Carriage Return war:*/
|
28 | if (iLastSymbol == 13) |
29 | {
|
30 | /*Gebe das Linefeed zurück*/
|
31 | iLastSymbol = iSymbol; |
32 | return iSymbol; |
33 | }
|
34 | else
|
35 | {
|
36 | /*Gebe nichts zurück*/
|
37 | iLastSymbol = iSymbol; |
38 | return ' '; |
39 | }
|
40 | }
|
41 | else
|
42 | {
|
43 | /*Gib das gelesene Zeichen zurück*/
|
44 | iLastSymbol = iSymbol; |
45 | return iSymbol; |
46 | }
|
47 | }
|
48 | |
49 | /**
|
50 | * Liest len Zeichen in den Puffer beginnend bei Zeichen off
|
51 | */
|
52 | public int read(char[] cbuf, int off, int len) throws IOException |
53 | {
|
54 | /*off Zeichen auslassen:*/
|
55 | this.skip(off); |
56 | /*Lesen der len Zeichen in den Puffer:*/
|
57 | for (int i=0; i < len; i++) |
58 | {
|
59 | int iCh = this.read(); |
60 | if (iCh == -1) |
61 | {
|
62 | if (i==0) return -1; |
63 | else return i; |
64 | }
|
65 | else
|
66 | {
|
67 | cbuf[i] = (char) iCh; |
68 | }
|
69 | }
|
70 | return len; |
71 | }
|
72 | }
|
>Die Klasse die du brauchst heißt FilterReader.
Ist das nicht etwas oversized?
Ich tendiere auch zu den regulären Ausdrücken: /[0-9a-zA-Z]+/ sollte
seinen Zweck erfüllen.
Es sei denn du brauchst noch mehr Infos aus der Quelldatei.
Kai Giebeler wrote: >>Die Klasse die du brauchst heißt FilterReader. > Ist das nicht etwas oversized? > > Ich tendiere auch zu den regulären Ausdrücken: /[0-9a-zA-Z]+/ sollte > seinen Zweck erfüllen. > > Es sei denn du brauchst noch mehr Infos aus der Quelldatei. Nö, das ist nicht oversized sondern elegant. In Java ist das genau die Vorgehensweise, wie sie die Designer der Stream-Klassen vorgesehen haben. Einen kleinen Haken habe ich an Mandrakes Beispiel allerdings gefunden. Er implementiert die Methode read(char[] buf,...) anders, als die Super-Klasse FilterReader. Der Parameter "ofs" wird als Offset im Stream verwendet. Er ist jedoch laut API-Doc der Offset im char-Array, ab dem die gelesenen Daten gespeichert werden. Daher dürfte für Steve_O die Neuimplementierung der Methode nicht erforderlich sein. Gruß Markus
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.