Entwickler-Ecke
Dateizugriff - Herausfinden ob erstes Zeichen Buchstabe oder Zahl ist
rennkuckuck - Do 09.06.05 14:00
Titel: Herausfinden ob erstes Zeichen Buchstabe oder Zahl ist
Hallo
habe folgende Frage:
Ich habe eine TXT datei die sieht ungefähr so aus:
R900066053
r900066068
8070084698
4070084699
H123454546
b493484999
nun möchte ich herausfinden ob das erste Zeichen ein Buchstabe oder eine Zahl ist....denn zeilen die am anfang einen buchstabe haben müssen gelöscht werden
kann mir jemand sagen wie das geht?
danke schon mal im vorraus für eure hilfe
Sprint - Do 09.06.05 14:04
Delphi-Quelltext
1: 2: 3: 4:
| if Length(S) > 0 then case S[1] of '0'..'9': ShowMessage('Erstes Zeichen ist eine Zahl'); end; |
retnyg - Do 09.06.05 14:04
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| function isFirstLetterZahl(s:string):boolean; begin case s[1] of '0'..'9': result := true; else result := false; end; end; |
edit: hochkomma vergessn :roll:
Delete - Do 09.06.05 14:04
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| const foo = 'a456984'; var s: String; begin s := foo; if s[1] in [#48..#57] then ShowMessage('Ziffer') else ShowMessage('Buchstabe'); |
retnyg - Do 09.06.05 14:05
löl :lol:
delfiphan - Do 09.06.05 14:12
;) Ich fasse also nochmals zusammen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| var ALine: String; begin ALine := 'Teststring';
Assert(Length(ALine)>=1);
Case ALine[1] of 'a'..'z','A'..'Z': ShowMessage('Buchstabe!'); '0'..'9': ShowMessage('Zahl!') else ShowMessage('Error!'); end;
if ALine[1] in Buchstabe then ShowMessage('Buchstabe!') else if ALine[1] in Zahl then ShowMessage('Zahl!') else ShowMessage('Error'); const Buchstabe = ['a'..'z','A'..'Z']; Zahl = ['0'..'9']; |
rennkuckuck - Do 09.06.05 15:32
danke für eure antworten schonmal. :D
übrigends habe ich gerade gesehen dass es auch zeilen gibt bei denen buchstaben in der mitte oder am ende sind(diese zeilen müssen auch entfernt werden)also die sache dass es sich nur um den ersten buchstabe dreht ist jetzt auch nicht mehr gültig.....ich muss die ganze zeile überprüfen.
jetzt stehe ich schon wieder auf dem schlauch...könnt ihr gerade nochmal schreiben wie das jetzt geht wenn ich die ganze zeile überprüfen muss....?danke schonmal.
Tino - Do 09.06.05 16:07
Ungefähr so (nicht getestet):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Function IstZifferInText (aSting: String): Boolean; Var Loop: Integer; Begin IstZifferInText := False;
For Loop := 0 To Length (aString) Do If not aString[Loop] in [#48..#57] Then Begin IstZifferInText := True; Break; End; End; |
delfiphan - Do 09.06.05 19:37
Strings werden von 1 an indiziert und nicht 0. Ausserdem seh ich nicht ein, wieso man
[#48..#57] schreibt, statt
['0'..'9']. Das Zweite ist intuitiver und unabhängig von irgendwelchen Tabellen. Ausserdem fehlt die Klammerung nach dem
not (und es hat auch noch einen Schreibfehler in der Variable).
Deswegen nochmals:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| function IsNumeric(const AString: String): Boolean; var I: Integer; begin if Length(AString) = 0 then begin Result := False; exit; end; for I := 1 to Length(AString) do if not (AString[I] in ['0'..'9']) then begin Result := False; exit; end; Result := True; end; |
Delete - Do 09.06.05 19:42
delfiphan hat folgendes geschrieben: |
| Strings werden von 1 an indiziert und nicht 0. Ausserdem seh ich nicht ein, wieso man [#48..#57] schreibt, statt ['0'..'9']. Das Zweite ist intuitiver und unabhängig von irgendwelchen Tabellen. |
LOL, you saved my day. Sollte irgendjemad auf die Idee kommen, die ASCII Tabelle zu ändern, kannst du davon ausgehen, dass innerhalb kürzester Zeit der Informationsaustausch per Computer zusammenbricht.
alzaimar - Do 09.06.05 19:53
:flehan: Luckie, aber Du hast nicht *ganz* verstanden, was das Wort "intuitiv" bedeutet. Obwohl die Sache mit den unabhängigen Tabellen schon zum Schmunzeln einlädt. Ich kann mir aber nicht vorstellen, das delphifan davon ausgeht, das die ASCII-Tabelle neu gemsicht wird (lustig wär's allemal). Ich glaube eher, er meinte das auch im übertragenen Sinn.
Immerhin, delphifan's Version lässt sich auch unter Linux fehlerfrei kompilieren. Und auf einer IBM VMS mit EBCDIC. Sofern Delphi dafür endlich verfügbar wird. In diesem Sinne: :beer:
Delete - Do 09.06.05 19:56
Das mit dem 'intuitiv' habe ich schon verstanden. Ich bezog mich auf die Aussage mit der ASCII Tabelle.
alzaimar - Do 09.06.05 20:02
Is klar. Nich böse sein. Und nicht ernst nehmen. Bin grad Strohwitwer und darf die Kinder alleine versorgen :nut:
delfiphan - Do 09.06.05 20:16
Luckie hat folgendes geschrieben: |
| LOL, you saved my day. Sollte irgendjemad auf die Idee kommen, die ASCII Tabelle zu ändern, kannst du davon ausgehen, dass innerhalb kürzester Zeit der Informationsaustausch per Computer zusammenbricht. |
Frage mich, wie du jetzt plötzlich auf die ASCII-Tabelle-Verändern Geschichte kommst. Ich sagte bloss, dass ich keinen Grund sehe, es abhängig von etwas zu machen, wenn es nicht nötig ist. Was ich ursprünglich meinte ist: Ist unabhängig von irgendwelchen Tabellen, man muss also nicht nachschauen.
Wenn du mal einen genialen Algorithmus erfinden würdest und den veröffentlichen würdest, würdest du dein Werk wohl auch so unabhängig von irgendwelchen Tabellen und Konventionen machen, wie möglich. Oder sehe ich das falsch?
Wie dem auch sei. Die Diskussion ist eigentlich sowieso überflüssig. War ja nur ein Teil einer Nebenbemerkung.
retnyg - Do 09.06.05 22:33
süüüüüsss :mrgreen:
rennkuckuck - Fr 10.06.05 09:12
hallo
delphifan ich habe es mal mit vorlage deines codes probiert.sieht so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| const
Zahl = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
var fw: TextFile; TS : String; I: Integer; -------------------
for I := 1 to Length(TS) do if (TS[I] in Zahl) then begin WriteLn(fw, TS); end; |
läuft zwar schön durch aber das ergebnis ist nicht zufriedestellend.
denn was hierbei passiert ist folgendes:
hier ein beispiel:
die eingelesen zeile ist so:
15K6
dann findet er beim ersten und zweiten und beim vierten zeichen ne zahl also schreibt er es auf.beim dritten findet er keine zahl also lässt er es da weg...und das ergebnis sieht dann so aus: :o
15K6
15K6
15K6
dabei soll diese zeile eigentlich gar nicht drin stehn weil sie ja ein buchstabe enthält.
@luckie schönes kaninchen...habe auch eins :D
Moderiert von
Tino: Code- durch Delphi-Tags ersetzt.
Sprint - Fr 10.06.05 09:18
Wenn eine Zahl gefunden worden ist, musst du auch aus deiner for Schleife springen. z.B. mit Break.
Heiko - Fr 10.06.05 09:35
Warum macht ihr es euch so schwer mit der Überprüfung, ob etwas anderes als Zahlen eingegeben sind oder nicht. Versucht es mal damir
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var ZwischenInt: Integer; Text: String; begin Text:=15K6; if not StrToInt(Text, ZwischenInt) then begin ShowMessage(Text+' ist keine gültige Integerzahl!') end; end |
Stefan.Buchholtz - Fr 10.06.05 09:39
Luckie hat folgendes geschrieben: |
delfiphan hat folgendes geschrieben: | | Strings werden von 1 an indiziert und nicht 0. Ausserdem seh ich nicht ein, wieso man [#48..#57] schreibt, statt ['0'..'9']. Das Zweite ist intuitiver und unabhängig von irgendwelchen Tabellen. |
LOL, you saved my day. Sollte irgendjemad auf die Idee kommen, die ASCII Tabelle zu ändern, kannst du davon ausgehen, dass innerhalb kürzester Zeit der Informationsaustausch per Computer zusammenbricht. |
Auf Portabilität zu achten ist nie verkehrt - und nicht alle Rechnersysteme verwenden ASCII. Die
['0'..'9'] Variante funktioniert auch mit EBDIC oder UTF-16. Das heute geschriebener Code irgendwann mal mit Unicode-Strings arbeiten muss, ist schließlich nicht so abwegig.
Ganz davon abgesehen ist
['0'..'9'] auch noch leichter verständlich - nicht jeder hat die ASCII-Tabelle im Kopf. :wink:
Stefan
delfiphan - Fr 10.06.05 09:59
rennkuckuck hat folgendes geschrieben: |
hallo
delphifan ich habe es mal mit vorlage deines codes probiert.sieht so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| const
Zahl = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
var fw: TextFile; TS : String; I: Integer; -------------------
for I := 1 to Length(TS) do if (TS[I] in Zahl) then begin WriteLn(fw, TS); end; |
läuft zwar schön durch aber das ergebnis ist nicht zufriedestellend. |
Dein Code hat fast überhaupt keine Ähnlichkeit mit meinem Code ;) Am besten nimmst du einfach die Funktion isNumeric (siehe oben) wie sie ist.
Delphi-Quelltext
1: 2:
| if IsNumeric(TS) then |
//Edit: IsNumeric: Siehe erste Seite des Threads.
Tino - Fr 10.06.05 10:15
delfiphan hat folgendes geschrieben: |
| Ausserdem fehlt die Klammerung nach dem not (und es hat auch noch einen Schreibfehler in der Variable). |
Deshalb habe ich ja auch
| Tino hat folgendes geschrieben: |
| (nicht getestet) |
geschrieben. ;-)
rennkuckuck - Fr 10.06.05 11:28
Heiko wo steht schon mal was von isNumeric???
finde auch in der delphi hilfe nichts darüber...wäre natürlich klasse wenn es so ein funktion gäbe aber ich kann nichts darüber finden.
:(
delfiphan - Fr 10.06.05 11:33
http://www.delphi-forum.de/viewtopic.php?p=261301#261301
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| function IsNumeric(const AString: String): Boolean; var I: Integer; begin if Length(AString) = 0 then begin Result := False; exit; end; for I := 1 to Length(AString) do if not (AString[I] in ['0'..'9']) then begin Result := False; exit; end; Result := True; end; |
Evtl. zuerst noch ein Trim machen: IsNumeric(Trim(MyString))
Heiko - Fr 10.06.05 11:50
rennkuckuck hat folgendes geschrieben: |
Heiko wo steht schon mal was von isNumeric???
finde auch in der delphi hilfe nichts darüber...wäre natürlich klasse wenn es so ein funktion gäbe aber ich kann nichts darüber finden.
:( |
Warum fragst du gerade mich? Delfiphan hat IsNumeric herangetragen. Ich hatte die Variante mit TryStrToInt. Die Delphihilfe von D2k5 PE gibt zu IsNumeric folgendes aus (Ausschnitt):
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| IsNumeric returns True if the entire expression is recognized as a number; otherwise, it returns False. IsNumeric returns False if expression is a date expression.
The following example uses the IsNumeric function to determine whether a variable can be evaluated as a number:
Dim MyVar, MyCheck MyVar = 53 ' Assign a value. MyCheck = IsNumeric(MyVar) ' Returns True. MyVar = "459.95" ' Assign a value. MyCheck = IsNumeric(MyVar) ' Returns True. MyVar = "45 Help" ' Assign a value. MyCheck = IsNumeric(MyVar) ' Returns False. |
rennkuckuck - Fr 10.06.05 14:39
sorry heiko habe mich irgentwie in den namen geirrt
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!