| Autor |
Beitrag |
stefan1707
      
Beiträge: 19
|
Verfasst: Mi 21.02.07 09:47
Hallo,
ich würde gern aus einer Textdatei, die etwa so aussieht
Quelltext 1: 2: 3: 4: 5:
| -18.00 25.0 0.0 0.0 -0.59 0.00795587 -7.0585e-006 0.00398763 -0.00021446 1.2260 1.0349 -18.00 25.0 0.0 100.0 36.93 0.00793906 -0.0018104 0.00408818 -0.0028133 1.2747 1.0309 -18.00 25.0 0.0 200.0 75.17 0.00795887 -0.0033442 0.00437066 -0.0049484 1.3800 1.1252 -18.00 25.0 0.0 300.0 113.70 0.00795258 -0.0047314 0.00460283 -0.006852 1.4970 1.2453 -18.00 25.0 0.0 400.0 150.61 0.00774206 -0.0058583 0.00465553 -0.008496 1.6198 1.4132 |
die einzelnen Spalten in Arrays abspeichern.
Leider ist mir mit meinen beschrenkten mitteln nur möglich einzelne Zeilen abzuspeichern.
Hier ersteinmal mein Ansatz.(in dem nicht vielsteht;-)) Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure einlesen; var SL : TStringlist; i : integer; begin try SL:=TStringlist.Create; SL.Clear; SL.LoadFromFile(pfad1+'Textdatei1.txt'); For i := 0 to sl.count -1 do begin end; finally sl.Free; end; |
Ich kenne die Anzahl der Spalten nicht aber die Länge der Spalten.
Hoffe jemand kann mir helfen.
|
|
Corpsman
      
Beiträge: 228
KUbuntu 10.4
Lazarus
|
Verfasst: Mi 21.02.07 10:05
Hi,
Du hast anscheinend den Vorteil das deine Spalten immer mit " " von einander getrennt sind.
Mir scheint auch das es imer die selbe Anzahl an Spalten ist.
Also kannst du in etwa so etwas machen, !! Achtung habe das blind gecoded !!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| Function GetSpaltCount(value:String):integer; var erg:Integer; begin erg:= 0; while length(value) <> 0 do begin while pos(' ',Value)=1 do delete(value,1,1); if length(Value) <> 0 then begin inc(erg); while value[1] in ['0..'9','-','.'] do delete(value,1,1); end; end; result := erg; end; |
Beim Auslesen nimmst du dann
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: 30:
| var f:Textfile; z,s:String; l:Tstringlist; c,i,t:Integer; begin assignfile(f,Dateiname); reset(f); readln(f,s); c:=GetSpaltCount; l := Tstringlist.create; l.clear; l.add(s); while not erof(f) do begin readln(f,s); l.add(s); end; for i := 0 to l.count-1 do begin s:= l[i]; for t := 0 to c do begin While s[1] = ' ' do delete(s,1,1); z := copy(s,1,pos(' ',s)-1);
end; end; l.free; end; |
_________________ --
Just Try it.
|
|
stefan1707 
      
Beiträge: 19
|
Verfasst: Mi 21.02.07 10:41
Hallo,
Danke ertmal für Deine schnelle Antwort.
Also vielleicht hätte ich sagen sollen dass ich immer die anzahl der spalten kenne, d.h. sie ändert sich nicht.
Zu Deiner Lösung.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| c:=konstante; for i := 0 to l.count-1 do begin s:= l[i]; for t := 0 to c do begin While s[1] = ' ' do delete(s,1,1); z := copy(s,1,pos(' ',s)-1); Arr[i,t]:=z; end; end; l.free; end; |
Also ich hätte damit alle Zahlen in dem Array abgespeichert,oder?
Kannst Du mir vielleicht den Quellcode etwas erklären, da ich anscheinend ein bisschen Erklärungsresistent bin, und meine Programmierkenntnisse bescheiden sind 
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mi 21.02.07 11:15
@Corpsman: Wieso öffnest du die Textdatei nicht gleich mit der StringList?
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
stefan1707 
      
Beiträge: 19
|
Verfasst: Mi 21.02.07 11:38
@GTA-Place
Kannst Du mir vielleicht die while do schleife erklären?
Ich verstehe nicht wieso da s[1] nur betrachtet wird und nicht durchgelaufen wird, oder wird die List doch durchgelaufen? Ich sehe nicht wie ich alle Zahlen in einen zweidimension. Array reinbekomme.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| for t := 0 to c do begin While s[1] = ' ' do delete(s,1,1); z := copy(s,1,pos(' ',s)-1); Arr[i,t]:=z; end; end; l.free; |
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mi 21.02.07 12:05
Es wird geprüft, ob die 1. Stelle ein Leerzeichen ist. Wenn ja, wird dieses Zeichen gelöscht. Wenn nein, dann wird alles bis zum nächsten Leerzeichen kopiert und in das Array eingetragen.
Quelltext 1: 2: 3: 4: 5:
| Test Bla Blup ^-- kopieren ^-- löschen ^-- kopieren ^ löschen |
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
stefan1707 
      
Beiträge: 19
|
Verfasst: Mi 21.02.07 13:18
Ich habe den Quellcode jetzt verinnerlicht
Leider klappt die Methode nur wenn Leerzeichen die Werte trennen,
wie sehts aus wenn die Werte mit Taps getrennt sind?
kann mir jemand da eine Info geben?
Hier mein Source
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: 30:
| begin
c:=11; SL:=TStringlist.Create; SL.Clear; SL.LoadFromFile('C:\Documents and Settings\MinicS\Desktop\Test_MPSM\070215Test_MPSM-2.dat'); for i := 0 to Sl.count-1 do begin s:= Sl[i]; for t := 0 to c do begin While s[1] = ' ' do delete(s,1,1); while s[1]=' ' do delete(s,1,1); z := (copy(s,1,pos(' ',s)-1)); FEM_Kennlinien[i]:=StrToFLoat(z); end; end; Sl.free; SL:=TStringlist.Create; SL.Clear; i:=1; for i :=0 to 10 do sl.Add(FLoatToStr(FEM_Kennlinien[i]));
Sl.SaveToFile('C:\Documents and Settings\MinicS\Desktop\Test_MPSM\Test.dat'); Sl.free; end; |
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mi 21.02.07 13:23
Den Ascii-Code für die Tab-Taste benutzen, also #... (#13#10 -> neue Zeile z.B.). Ich würde das ganze aber anders lösen. Warum nicht mit DELIMITER?
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
stefan1707 
      
Beiträge: 19
|
Verfasst: Mi 21.02.07 13:50
Also,
das mit Delimiter habe ich nicht ganz verstanden
Kann mir jemand vielleicht erklären wie ich da mit dem Delimiter weiterkommen kann?
wenn nicht dann bitte klären wie ich den Asci-Code für die Tabtaste benutzen soll unter Delphi?
Das File was ich einlesen will kann ich nicht verändern.
|
|
Robinator
      
Beiträge: 275
WinXP
BDS 2006
|
Verfasst: Mi 21.02.07 14:14
Tabs kannst du per pos(#9, myString) heraussuchen, den Rest des Quellcodes brauchst du nicht ändern.
Per Delimiter könntest du dir eine explode Funktion schreiben, was das in diesem Kontext bringen soll ist mir allerdings auch nicht ganz klar
Gruss, rob
_________________ erare humanum est
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Mi 21.02.07 14:43
Hallo! Ich arbeite immer mit dieser Funktion: Delphi-Quelltext 1:
| function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray; | Deklaration 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: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| type TStringDynArray = array of string;
function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray; var SepLen: Integer; F, P: PChar; ALen, Index: Integer; begin SetLength(Result, 0); if (S = '') or (Limit < 0) then Exit; if Separator = '' then begin SetLength(Result, 1); Result[0] := S; Exit; end; SepLen := Length(Separator); ALen := Limit; SetLength(Result, ALen);
Index := 0; P := PChar(S); while P^ <> #0 do begin F := P; P := StrPos(P, PChar(Separator)); if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then P := StrEnd(F); if Index >= ALen then begin Inc(ALen, 5); SetLength(Result, ALen); end; SetString(Result[Index], F, P - F); Inc(Index); if P^ <> #0 then Inc(P, SepLen); end; if Index < ALen then SetLength(Result, Index); end; | Und aufrufen kannst es dann so: Delphi-Quelltext 1: 2: 3: 4:
| var LeerExplode: TStringDynArray; begin LeerExplode:= explode(' ', DeinStringDerExplodedWerdenSoll); end; | LeerExplode ist dann wie ein ganz normales dyn. Array zu behandeln. Delphi-Quelltext 1: 2: 3: 4:
| for i:= low(LeerExplode) to high(LeerExplode) do begin showmessage(LeerExplode[i]); end; | Mit ner kleinen Schleife kannst du dann nach Leerzeichen und Tab filtern und "exploden". LG Stefan
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
stefan1707 
      
Beiträge: 19
|
Verfasst: Mi 21.02.07 14:46
Also ich weis leider nicht wo ich pos(#9, myString) benutzen soll,
Bei meinen Versuch klappt es leider nicht. Die Taps werden immernoch übersprungen.
Vielleicht kann mir ja jemand sagen wo ich die Tabs raussuchen kann
Hier der Source
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| for i := 0 to SL.count-1 do begin s:= Sl[i]; for t := 0 to c do begin While s[1] =('') do delete(s,1,1); pos(#9, s); z := copy(s,1,pos(' ',s)-1); FEM_Kennlinien[t,i]:=(z); |
// Edit schon verstanden
in z:=copy(s,1,pos('#9',s)-1); einsetzten
|
|
Robinator
      
Beiträge: 275
WinXP
BDS 2006
|
Verfasst: Mi 21.02.07 15:00
stefan1707 hat folgendes geschrieben: | Also ich weis leider nicht wo ich pos(#9, myString) benutzen soll,
Bei meinen Versuch klappt es leider nicht. Die Taps werden immernoch übersprungen.
Vielleicht kann mir ja jemand sagen wo ich die Tabs raussuchen kann
Hier der Source
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| for i := 0 to SL.count-1 do begin s:= Sl[i]; for t := 0 to c do begin While s[1] =('') do delete(s,1,1); pos(#9, s); z := copy(s,1,pos(' ',s)-1); FEM_Kennlinien[t,i]:=(z); |
// Edit schon verstanden
in z:=copy(s,1,pos('#9',s)-1); einsetzten |
Sollte ich dich richtig verstanden haben, gibt es in der Datei zwei unterschiedliche Delimiter. Wenn das so ist, musst du nach beidem suchen (also nach ' ' und nach #9), die Werte vergleichen und dann bis zum kleineren Kopieren (Also immer bis zu dem Zeichen, was als nächstes kommt). Problem dabei ist, dass Pos dir in dem Fall, dass nichts gefunden wird, 0 zurückgibt, da musst du noch drumrumtüdeln
gruss, Rob
_________________ erare humanum est
|
|
stefan1707 
      
Beiträge: 19
|
Verfasst: Mi 21.02.07 17:19
Also ich habe mich lange mit meinem Problem Auseinander gesetzt.
In meinem Textfile das ich in einem Array einlesen will, sind die einzelnen Werte nur noch mit Tabs getreent.
Quelltext 1: 2: 3: 4: 5:
| -22.50 0.0 0.0 12.5 0.0 -3.7064e-008 0.00104144 -1.3439e-008 0.00128937 0.13 0.19 -22.50 0.0 0.0 25.0 0.0 -7.5608e-008 0.00210077 -2.7697e-007 0.00259857 0.27 0.38 -22.50 0.0 0.0 37.5 0.0 -1.1073e-007 0.00316221 -9.3855e-007 0.00393056 0.41 0.56 -22.50 0.0 0.0 50.0 0.0 -1.3402e-007 0.00422082 -1.4931e-006 0.00527997 0.55 0.75 -22.50 0.0 0.0 62.5 0.0 -1.4244e-007 0.00523404 -2.0398e-006 0.00659873 0.69 0.92 |
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:
| procedure FEM; var LeerExplode: TStringDynArray; Sl :TStringList; s,z : string; FEM_Kennlinien: Array [0..15000] of string; i,t : integer; begin SL:=TStringlist.Create; SL.Clear; Sl.LoadFromFile('C:\Documents and Settings\MinicS\Desktop\Test_MPSM\061212-SM-210-160-oderso.TXT');
For i:= 0 to sl.Count-1 do begin s:= sl[i]; for t := 0 to 10 do While s[i] = ' ' do delete(s,i,i); z := (copy(s,1,pos('#9',s)-1)); FEM_Kennlinien[i]:=(z); end; SL:=TStringlist.Create; SL.Clear; for i:= 0 to 10 do SL.Add(FEM_Kennlinien[i]); Sl.SaveToFile('C:\Temp\Test.dat'); Sl.free; end; |
Ich bekomme garkeine Werte in z hinein, warum?
Mein Fehler liegt wohl in der Zeile 18 und ich weis nicht woran es liegt.  (
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mi 21.02.07 18:35
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
|