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[1of
      '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[1of '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[1in [#48..#57then
    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);

// Möglichkeit 1
  Case ALine[1of
   'a'..'z','A'..'Z':
     ShowMessage('Buchstabe!');
   '0'..'9':
     ShowMessage('Zahl!')
   else
     ShowMessage('Error!');
  end;

// Möglichkeit 2
  if ALine[1in Buchstabe then
   ShowMessage('Buchstabe!')
  else if ALine[1in Zahl then
   ShowMessage('Zahl!')
  else
   ShowMessage('Error');
  
// wobei
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..#57Then
      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

user profile icondelfiphan 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:


Delete - Do 09.06.05 20:05

Du auch? Ich habe gerade das Kaninchen [http://www.luckie-online.de/Ablage/04%20Gipsy.jpg] meiner Freundin zur Pflege hier. Aber wir werden offtopic. ;)


delfiphan - Do 09.06.05 20:16

user profile iconLuckie 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

user profile iconLuckie hat folgendes geschrieben:
Du auch? Ich habe gerade das Kaninchen [http://www.luckie-online.de/Ablage/04%20Gipsy.jpg] meiner Freundin zur Pflege hier.

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);                 {  schreibe TS in die Datei }
          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 user profile iconTino: 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

user profile iconLuckie hat folgendes geschrieben:
user profile icondelfiphan 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

user profile iconrennkuckuck 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);                 {  schreibe TS in die Datei }
          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
 // TS besteht nur aus Ziffern


//Edit: IsNumeric: Siehe erste Seite des Threads.


Tino - Fr 10.06.05 10:15

user profile icondelfiphan 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

user profile iconrennkuckuck 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