 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
mismoose
Anmeldungsdatum: 13.05.2005 Beiträge: 6
|
Verfasst am: 28.05.2005, 09:05 Titel: Umlaute ersetzen? |
|
|
Hallo,
ich habe folgendes Problem.
Ich will mit einer qbasic-Datei eine Textdatei auslesen, und aus deren Inhalt alle Umlaute durch ae, oe usw. ersetzen.
Ich habe das so versucht:
FOR b = 1 to LEN(text$)
SELECT CASE MID$(text$, b, 1)
CASE "CHR$(132)"
MID$(text$, b) = "ae"
Aber das klappt nicht.
Kann jemand vielleicht einen Fehler finden?
Danke! |
|
Nach oben |
|
 |
Jan

Anmeldungsdatum: 04.01.2005 Beiträge: 74
|
Verfasst am: 28.05.2005, 09:16 Titel: |
|
|
Morgen!
1. Die Anführungsstrichen bei dem CASE müssen weg:
Code: |
FOR b = 1 to LEN(text$)
SELECT CASE MID$(text$, b, 1)
CASE CHR$(132)
...
END SELECT
NEXT b
|
Weiterhin wird durch diese Anweisung,
Code: | MID$(text$, b) = "ae" |
der restliche Teil des Wortes überschrieben, glaube ich.
daher solltest du alle Strings die du aus der variablen TEXT$ ausliest in einer anderen abspeichern:
Code: |
FOR b = 1 to LEN(text$)
a$ = MID$(text$,b,1)
SELECT CASE a$
CASE CHR$(132)
temp$=temp$+"ae"
...
...
CASE ELSE
temp$=temp$+a$
END SELECT
NEXT b
|
Am Ende noch einen CASE ELSE, da dann, wenn kein Umlaut vorhanden ist der String trotzdem kopiert wird. |
|
Nach oben |
|
 |
pinkpanther

Anmeldungsdatum: 28.05.2005 Beiträge: 79 Wohnort: Wien
|
Verfasst am: 28.05.2005, 12:30 Titel: Umlaute ersetzen! |
|
|
Ich würde Dein Programmierproblem folgendermaßen lösen:
Code: |
DECLARE FUNCTION sonderzeichenUmschreiben$ (Text$)
Text$ = "Der Sommer ist die schönste Jahreszeit zum Gärtnern."
CLS
COLOR 15
PRINT
PRINT "Der Text"
PRINT
COLOR 11
PRINT " "; Text$
COLOR 15
PRINT
PRINT "lautet nach Umwandlung der darin enthaltenen Sonderzeichen:"
PRINT
COLOR 10
PRINT " "; sonderzeichenUmschreiben$(Text$)
COLOR 7
END
FUNCTION sonderzeichenUmschreiben$ (Text$)
' Liste der umzuwandelnden Sonderzeichen ('sz') und
' Liste der Ersatzzeichen ('ez')
CONST szListe$ = "äöüßÄÖÜ"
CONST ezListe$ = "aeoeueszAEOEUE"
' Parameter 'Text$' lokaler Variablen 'tempText$' zuweisen
' (die Funktion soll Parameter 'Text$' nicht verändern)
tempText$ = Text$
' Für jedes Sonderzeichen in 'szListe$' feststellen, ob
' und an welchen Positionen in 'tempText$' es vorkommt.
' Jedes Vorkommen eines Sonderzeichens durch das entsprechende
' Ersatzzeichen ('ezListe$') ersetzen.
FOR b% = 1 TO LEN(szListe$)
' ermittle je ein Sonderzeichen und ein Ersatzzeichen, die fü?r
' den aktuellen Schleifendurchlauf gelten sollen.
' Bei der Ermittlung der Position des aktuellen Ersatzzeichens
' in 'ezListe$' ist zu berü?cksichtigen, dass hier jedes Listenelement
' aus zwei Zeichen besteht.
aktuellesSZ$ = MID$(szListe$, b%, 1)
aktuellesEZ$ = MID$(ezListe$, (b% - 1) * 2 + 1, 2)
' 'letzteSZpos%' (Variable, die die Fundposition eines Sonderzeichens
' speichert) initialisieren, weil sonst bei nachfolgenden Sonderzeichen
' möglicherweise nicht ab Position 1 geprü?ft wird.
letzteSZpos% = 0
' Verarbeitungsschleife f?ür Prü?f- und Ersetzungsvorgang
' (es können mehrere Sonderzeichen der gleichen Art in 'tempText$'
' vorkommen)
DO
' mit Hilfe der Funktion INSTR Vorkommen/Position des aktuellen
' Sonderzeichens feststellen und in 'letzteSZpos%' speichern.
' Der Vergleich soll ab der der letzten Fundstelle folgenden Position
' ('letzteSZpos% + 1') beginnen (beim ersten Schleifendurchlauf ist
' dies durch die Initialisierung von 'letzteSZpos%' bedingt 1)
letzteSZpos% = INSTR(letzteSZpos% + 1, tempText$, aktuellesSZ$)
' Wurde ein Vorkommen des aktuellen Sonderzichens festgestellt,
' ('letzteSZpos%' <> 0), Sonderzeichen in 'tempText$' durch
' Ersatzzeichen ersetzen.
' Dazu mit Hilfe von LEFT$/MID$ 'tempText$' in zwei Teilzeichenfolgen
' aufteilen, die vom Anfang bis unmittelbar vor das Sonderzeichen
' bzw. von unmittelbar nach dem Sonderzeichen bis zum Ende der
' Zeichenfolge reichen und mit dem Ersatzzeichen dazwischen wieder
' verketten.
IF letzteSZpos% THEN
tempText$ = LEFT$(tempText$, letzteSZpos% - 1) + aktuellesEZ$ + MID$(tempText$, letzteSZpos% + 1)
END IF
' Schleife so lange wiederholen, als sich das aktuelle Sonderzeichen
' in 'tempText$' wiederholt, 'letzteSZpos%' also ungleich Null ist.
LOOP WHILE letzteSZpos%
' nächstes Sonderzeichen aus 'szListe$' verarbeiten.
NEXT
' umgewandelten Text dem Funktionsrü?ckgabewert zuweisen
sonderzeichenUmschreiben$ = tempText$
END FUNCTION |
Grüße
pinkpanther |
|
Nach oben |
|
 |
mismoose
Anmeldungsdatum: 13.05.2005 Beiträge: 6
|
Verfasst am: 29.05.2005, 13:52 Titel: |
|
|
Danke für die ausführlichen Antworten!
Leider hat nichts so richtig funktioniert. Nach langem Rumprobieren, hab ich festgestellt, dass es klappt, wenn ich die falsch angezeigten Umlaute durch "ae" und so weiter ersetze. Zum Beispiel wurde "ü" als ³ angezeit. Dann habe ich ³ durch "oe" ersetzt. Kommt mir zwar irgendwie komisch vor, aber die anderen Möglichkeiten haben nicht funktioniert.
Meint ihr, dass es vom PC oder vom Betriebssystem abhängt, wie die Umlaute dargestellt werden? Weil dann würde das Ersetzen ja nciht bei jedem funktionieren.
Und noch eine Frage: Kann man Absätze wie genauso wie Leerzeichen aus einem Text schneiden? Wenn ja, wie?
Ich hab schon überall gesucht, aber ncihts gefunden.
Ich hoffe, ihr könnt mir helfen. |
|
Nach oben |
|
 |
Kai Bareis

Anmeldungsdatum: 10.09.2004 Beiträge: 545 Wohnort: Baden Würtemberg
|
Verfasst am: 29.05.2005, 13:57 Titel: |
|
|
Das wird daran liegen wen du deine Text Datei mit dem Windows Notepad öffnest. Da dieser den ANSI Zeichencode benutzt und Qbasic arbeitet halt mit dem ASCII Code. _________________ MfG Kai Bareis
Es ist noch kein Meister vom Himmel gefallen! Warum einfach wens auch umständlich geht! |
|
Nach oben |
|
 |
pinkpanther

Anmeldungsdatum: 28.05.2005 Beiträge: 79 Wohnort: Wien
|
Verfasst am: 29.05.2005, 14:56 Titel: |
|
|
Liebe/r mismoose,
Grund für die unterschiedliche Darstellung von Sonderzeichen unter DOS bzw. Windows sind die im jeweiligen Betriebssystem verwendeten unterschiedlichen Zeichensatztabellen (ASCII/ANSI), in denen deutsche Sonderzeichen an unterschiedlichen Positionen aufscheinen.
So gesehen stimmt deine Vermutung mit der "Abhängigkeit vom Betriebssystem". Innerhalb der im deutschen Sprachraum vertriebenen Windows-Versionen sollte diese "Codeverschiebung" allerdings nicht auftreten, da alle diese Versionen auf den gleichen (ANSI-)Standard zurückgreifen. Ausnahmen von dieser Regel bilden lediglich die Windows-Versionen 3.x, welche noch die unter DOS eingesetzte ASCII-Zeichentabelle verwenden.
Anbei mein bereits oben veröffentlichtes Programmbeispiel *ohne* Verwendung deutscher Sonderzeichen. Du solltest dieses Beispiel nunmehr problemlos und ohne weitere Überarbeitung über die Zwischenablage als Textdatei ablegen und von dort mit QBasic/QBX öffnen und ablaufen lassen können.
Code: |
DECLARE FUNCTION sonderzeichenUmschreiben$ (Text$)
'Testtext: "Der Sommer ist die schönste Jahreszeit zum Gärtnern"
Text$ = "Der Sommer ist die sch" + CHR$(148) + "nste Jahreszeit zum "
Text$ = Text$ + "G" + CHR$(132) + "rtnern."
CLS
COLOR 15
PRINT
PRINT "Der Text"
PRINT
COLOR 11
PRINT " "; Text$
COLOR 15
PRINT
PRINT "lautet nach Umwandlung der darin enthaltenen Sonderzeichen:"
PRINT
COLOR 10
PRINT " "; sonderzeichenUmschreiben$(Text$)
COLOR 7
END
FUNCTION sonderzeichenUmschreiben$ (Text$)
STATIC szListe$, ezListe$
' Wenn noch nicht erstellt ( = Stringlaenge gleich Null),
' Liste der umzuwandelnden Sonderzeichen ('sz') und Liste der
' Ersatzzeichen ('ez') unter statischen Variablen anlegen
IF LEN(szListe$) = 0 THEN
szListe$ = CHR$(132) + CHR$(148) + CHR$(129) + CHR$(225)
szListe$ = szListe$ + CHR$(142) + CHR$(153) + CHR$(154)
' Elemente 'szListe$':
' Sonderzeichen wie in 'ezListe$' umschrieben
END IF
IF LEN(ezListe$) = 0 THEN
ezListe$ = "aeoeueszAEOEUE"
END IF
' Parameter 'Text$' lokaler Variablen 'tempText$' zuweisen
' (die Funktion soll Parameter 'Text$' nicht veraendern)
tempText$ = Text$
' Fuer jedes Sonderzeichen in 'szListe$' feststellen, ob
' und an welchen Positionen in 'tempText$' es vorkommt.
' Jedes Vorkommen eines Sonderzeichens durch das entsprechende
' Ersatzzeichen ('ezListe$') ersetzen.
FOR b% = 1 TO LEN(szListe$)
' ermittle je ein Sonderzeichen und ein Ersatzzeichen, die fuer
' den aktuellen Schleifendurchlauf gelten sollen.
' Bei der Ermittlung der Position des aktuellen Ersatzzeichens
' in 'ezListe$' ist zu beruecksichtigen, dass hier jedes Listenelement
' aus zwei Zeichen besteht.
aktuellesSZ$ = MID$(szListe$, b%, 1)
aktuellesEZ$ = MID$(ezListe$, (b% - 1) * 2 + 1, 2)
' 'letzteSZpos%' (Variable, die die Fundposition eines Sonderzeichens
' speichert) initialisieren, weil sonst bei nachfolgenden Sonderzeichen
' moeglicherweise nicht ab Position 1 geprueft wird.
letzteSZpos% = 0
' Verarbeitungsschleife fuer Pruef- und Ersetzungsvorgang
' (es koennen mehrere Sonderzeichen der gleichen Art in 'tempText$'
' vorkommen)
DO
' mit Hilfe der Funktion INSTR Vorkommen/Position des aktuellen
' Sonderzeichens feststellen und in 'letzteSZpos%' speichern.
' Der Vergleich soll ab der der letzten Fundstelle folgenden Position
' ('letzteSZpos% + 1') beginnen (beim ersten Schleifendurchlauf ist
' dies durch die Initialisierung von 'letzteSZpos%' bedingt 1)
letzteSZpos% = INSTR(letzteSZpos% + 1, tempText$, aktuellesSZ$)
' Wurde ein Vorkommen des aktuellen Sonderzeichens festgestellt,
' ('letzteSZpos%' <> 0), Sonderzeichen in 'tempText$' durch
' Ersatzzeichen ersetzen.
' Dazu mit Hilfe von LEFT$/MID$ 'tempText$' in zwei Teilzeichenfolgen
' aufteilen, die vom Anfang bis unmittelbar vor das Sonderzeichen
' bzw. von unmittelbar nach dem Sonderzeichen bis zum Ende der
' Zeichenfolge reichen und mit dem Ersatzzeichen dazwischen wieder
' verketten.
IF letzteSZpos% THEN
tempText$ = LEFT$(tempText$, letzteSZpos% - 1) + aktuellesEZ$ + MID$(tempText$, letzteSZpos% + 1)
END IF
' Schleife so lange wiederholen, als sich das aktuelle Sonderzeichen
' in 'tempText$' wiederholt, 'letzteSZpos%' also ungleich Null ist.
LOOP WHILE letzteSZpos%
' naechstes Sonderzeichen aus 'szListe$' verarbeiten.
NEXT
' umgewandelten Text dem Funktionsrueckgabewert zuweisen
sonderzeichenUmschreiben$ = tempText$
END FUNCTION |
Zu deiner nächsten Frage:
Auch Absätze (im Programmiererjargon auch Zeilenvorschub oder CR genannt) lassen sich wie Leerzeichen oder jedes beliebige andere Zeichen aus einer Zeichenfolge "ausschneiden". Während du aber Leerzeichen sowohl über ihre Zeichendarstellung (" "), als auch über CHR$(32) ansprechen kannst, kannst du Absätze im Programmcode *nur* über CHR$(13) darstellen.
Code: |
absatzPos% = INSTR(Text$, CHR$(13))
|
Hoffentlich sind damit alle Klarheiten beseitigt! ;-)
Schönen Sonntag noch!
LG
pinkpanther |
|
Nach oben |
|
 |
mismoose
Anmeldungsdatum: 13.05.2005 Beiträge: 6
|
Verfasst am: 29.05.2005, 20:19 Titel: |
|
|
Hey pinkpanther!
Das mit dem Absatz habe ich jetzt ausprobiert.
Es werden jetzt tatsächlich keine mehr angezeigt, aber dafür ist da jetzt so ein kleines schwarzes Kästchen.
Und dein Vorschlag mit den Umlauten klappt immer noch nciht. Vielleicht liegt s daran, dass ich das nicht auf einen Text direkt im Programm anwenden will, sondern auf einen, der aus einer Textdatei eingelesen wird?
Sorry, ich glaube, das sind totale Newbiefragen.
LG, mis(s)moose
(hab bei der Anmeldung ein s vergessen.
Bin etwas chaotisch.) |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 29.05.2005, 20:22 Titel: |
|
|
Das kannst du doch unter Profil ändern, oder?
missmoose hat Folgendes geschrieben: |
Vielleicht liegt s daran, dass ich das nicht auf einen Text direkt im Programm anwenden will, sondern auf einen, der aus einer Textdatei eingelesen wird?
|
Daran liegt's bestimmt nicht, FUNCTION ist und bleibt FUNCTION.
EDIT: Oh, sorry, ich dachte, den Namen könnte man unter Profil ändern...
jb |
|
Nach oben |
|
 |
pinkpanther

Anmeldungsdatum: 28.05.2005 Beiträge: 79 Wohnort: Wien
|
Verfasst am: 29.05.2005, 21:27 Titel: |
|
|
Liebe(?) Missmoose,
was genau klappt nicht? Mein Code müsste eigentlich funktionieren!
Wie jb richtig bemerkt hat, ist es grundsätzlich egal, ob der String, der als Funktionsparameter übergeben wird, ursprünglich aus einer Textdatei gelesen wurde oder von einer Textkonstante ( = Text im Programmcode, der zwischen "..." steht) stammt.
Was mir aber als mögliche Problemursache einfällt, ist, dass die von dir verarbeitete Datei nicht im ASCII-, sondern im ANSI-Format vorliegt (also z.B. von einem Windows-Editor oder einer sonstigen Windows-Anwendung erstellt wurde). Meine FUNCTION, die auf ASCII-Codes abstellt, könnte in diesem Fall die umzuwandelnden Umlaute natürlich nicht finden.
Wenn meine Vermutung aber nicht stimmt und die verarbeitete Datei doch im ASCII-Format vorliegt (also von einer DOS-Anwendung erstellt wurde), würde ich vorschlagen, dass du den Programmteil, von dem aus du die FUNCTION aufrufst, postest und auch den Inhalt der zu verarbeitenden Textdatei (auszugsweise) wiedergibst.
So lässt sich das Problem am einfachsten eingrenzen, denke ich.
Zum Absatz-Problem:
Einer Absatzmarke (CHR$(13)) folgt im Regelfall immer ein Zeilenvorschubzeichen (CHR$(10)) nach, sodass du beide Zeichen ersetzen müsstest, wenn du den Zeilenumbruch entfernen willst. Wenn du nur CHR$(13) löschst, bleibt an jedem Zeilenende ein CHR$(10) übrig, das der Windows-Texteditor nicht als Zeilenumbruch erkennt und als nicht druckbares Zeichen auch nicht darstellen kann, weswegen ein schwarzes Kästchen angezeigt wird.
Der Code zum Ersetzen einer Zeilenschaltung in einer Zeichenfolgevariablen muss lauten:
Code: |
DECLARE FUNCTION absaetzeEntfernen$ (rText$)
Text$ = "Fest gemauert in der Erden" + CHR$(13) + CHR$(10)
Text$ = Text$ + "steht die Form, aus Lehm gebrannt." + CHR$(13) + CHR$(10)
Text$ = Text$ + "Heute muss die Glocke werden," + CHR$(13) + CHR$(10)
Text$ = Text$ + "frisch, Gesellen, seid zur Hand!"
CLS
PRINT absaetzeEntfernen$(Text$)
FUNCTION absaetzeEntfernen$ (Text$)
' CHR$(13) + CHR$(10) (= Absatzmarke) einmal je Programmaufruf in
' statischer Variablen 'CrLf$' ablegen
STATIC CrLf$
IF LEN(CrLf$) = 0 THEN
CrLf$ = CHR$(13) + CHR$(10)
END IF
' Parameter soll nicht veraendert werden, daher dessen Wert der
' lokalen Variablen 'tempText$' zuweisen
tempText$ = Text$
' Text nach Absatzmarken durchsuchen und jedes Vorkommen
' durch Leerzeichen ersetzen (sonst kleben Woerter am Zeilenende/
' naechsten Zeilenanfang zusammen)
DO
' Position der Absatzmarke in 'absatzPos%' ablegen, wenn vorhanden
' (> 0), 'tempText$' in zwei Teilzeichenfolgen aufsplitten: vom
' Anfang bis unmittelbar vor der Absatzmarke, von unmittelbar nach
' der Absatzmarke bis Zeichenfolgenende; Teilzeichenfolgen mit
' dazwischen liegendem Leerzeichen wieder verketten und 'tempText$'
' zuweisen.
absatzPos% = INSTR(absatzPos% + 1, tempText$, CrLf$)
IF absatzPos% THEN
tempText$ = LEFT$(tempText$, absatzPos% - 1) + " " + MID$(tempText$, absatzPos% + 2)
END IF
' Schleife fortsetzen, solange im aktuellen Durchlauf
' eine Absatzmarke erkannt wurde.
LOOP WHILE absatzPos%
' Text mit entfernten Absatzmarken ('tempText$') als Funktions-
' rueckgabewert zuweisen
absaetzeEntfernen$ = tempText$
END FUNCTION |
LG
pinkpanther |
|
Nach oben |
|
 |
mismoose
Anmeldungsdatum: 13.05.2005 Beiträge: 6
|
Verfasst am: 30.05.2005, 16:52 Titel: |
|
|
Hi pinkpanther!
Danke für die Zeilenvorschubhilfe!
Funktioniert jetzt prima!
Und ja, ich habe den Text bis jetzt immer aus einer Editor-Textdatei gelesen.
Damit wäre dann ja auch die Ursache des Problems gefunden.
Ich teste jetzt gleich mal zum Süaß, wie das ganze mit einer Word-Datei klappt.
Liebe Grüße,
(die) missmoose |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 30.05.2005, 17:18 Titel: |
|
|
Bei nem Word-Doc wirste schöne Probleme haben, weil neben dem Text natürlich auch die Formatierung gespeichert wird. Die kann als TXT aufgemacht auch als ä ö oder ü gespeichert sein, so dass du deine DOC wohl eher zerstören wirst.... _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
mismoose
Anmeldungsdatum: 13.05.2005 Beiträge: 6
|
Verfasst am: 30.05.2005, 17:37 Titel: |
|
|
Hi Dusky_Joe!
Wie ich gerade festgestellt habe, kann ich überhaupt keinen Text aus Word_dokumenten auslesen. Das klappt einfach nicht.
Schade...
missmoose |
|
Nach oben |
|
 |
pinkpanther

Anmeldungsdatum: 28.05.2005 Beiträge: 79 Wohnort: Wien
|
Verfasst am: 30.05.2005, 19:18 Titel: |
|
|
Liebe Missmoose!
Nur der Sicherheit halber noch der Weg, wie du Sonderzeichen auch aus einer unter Windows erzeugten Textdatei entfernst:
Leg meinen am 29.05. um 14:56 geposteten Code (wieder) als Textdatei ab, öffne die Datei allerdings mit dem Windows-Editor und überschreibe...
... die Zuweisung von Text$ am Anfang (2 Zeilen):
Code: | Text$ = "Der Sommer ist die schönste Jahreszeit zum Gärtnern" |
...die ersten Zeilen der FUNCTION (bis zum ersten END IF):
Code: | FUNCTION sonderzeichenUmschreiben$ (Text$)
STATIC szListe$, ezListe$
' Wenn noch nicht erstellt ( = Stringlaenge gleich Null),
' Liste der umzuwandelnden Sonderzeichen ('sz') und Liste der
' Ersatzzeichen ('ez') unter statischen Variablen anlegen
IF LEN(szListe$) = 0 THEN
szListe$ = "äöüßAEOEUE"
' Elemente 'szListe$':
' Sonderzeichen wie in 'ezListe$' umschrieben
END IF
... |
Ein Word-Dokument mit QBasic auszulesen ist tatsächlich eine komplexe Aufgabe, vor allem, wenn darin reichlich Tabellen, Grafiken und Formatierungen vorkommen. Es ist die Frage, ob sich der Aufwand wirklich lohnt...
Viel Spaß noch - keep on coding!
LG
pinkpanther |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|