Autor Beitrag
stefan1707
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 19



BeitragVerfasst: Mi 21.02.07 09:47 
Hallo,
ich würde gern aus einer Textdatei, die etwa so aussieht
ausblenden 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;-))
ausblenden 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;  {Stringliste bereit machen}
   SL.Clear;
   SL.LoadFromFile(pfad1+'Textdatei1.txt'); //Textdatei1 in SL geladen
   For i := 0 to sl.count -1 do //
     begin //.. hier könnte ich einzelne Zeilen abfragen aber das bringt nichts
     //Einlesen der Spalten in Arrays
     end;
finally
   sl.Free;  //Stringliste frei machen
end;

Ich kenne die Anzahl der Spalten nicht aber die Länge der Spalten.
Hoffe jemand kann mir helfen.
Corpsman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228

KUbuntu 10.4
Lazarus
BeitragVerfasst: 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 !!
ausblenden 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;
  // Solange der String net Leer ist
  while length(value) <> 0 do begin
    // löschen der führenden Leerzeichen
    while pos(' ',Value)=1 do
      delete(value,1,1);
    // Wenn es dann noch ne Zahl gibt Erg +1
    if length(Value) <> 0 then begin
      inc(erg);
      // Löschen der Zahl
      while value[1] in ['0..'9','-','.'] do
        delete(value,1,1);
    end;
  end;
  result := erg;
end;


Beim Auslesen nimmst du dann
ausblenden 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;
// Hier weist du nun die Anzahl der Zeilen und der Spalten die du aus l auslesen must.
// Immer mit
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);
// Deine Zahl steht nun in z und mus an die Position i,t im Array gespeichert werden 

end;
end;
l.free;
end;

_________________
--
Just Try it.
stefan1707 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 19



BeitragVerfasst: 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.

ausblenden 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);  
// Deine Zahl steht nun in z und mus an die Position i,t im Array gespeichert werden
// mit einem zweidimensionalen Array abspeichern?
Arr[i,t]:=z;  // sollte es so einfach sein??
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 19



BeitragVerfasst: 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.
ausblenden 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   // Warum nur an der Stelle 1? 
delete(s,1,1);    
z := copy(s,1,pos(' ',s)-1);  // Was wird hier genau kopiert, warum -1??  
// Deine Zahl steht nun in z und mus an die Position i,t im Array gespeichert werden  
// mit einem zweidimensionalen Array abspeichern?  
Arr[i,t]:=z;  // sollte es so einfach sein??  
end;    
end;    
l.free;    
//..
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: 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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 19



BeitragVerfasst: 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
ausblenden 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;  {Stringliste bereit machen}
   SL.Clear;
   // Einlesen von Platte muss für zweiten berechnungschritt unter TepSED passieren

   SL.LoadFromFile('C:\Documents and Settings\MinicS\Desktop\Test_MPSM\070215Test_MPSM-2.dat'); //Textdatei1 in SL geladen
   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);// Deine Zahl steht nun in z und mus an die Position i,t im Array gespeichert werden

end;
end;
Sl.free;
SL:=TStringlist.Create;  {Stringliste bereit machen}
   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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: 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 Suche in der Entwickler-Ecke DELIMITER?

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
stefan1707 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 19



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 275

WinXP
BDS 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Mi 21.02.07 14:43 
Hallo!

Ich arbeite immer mit dieser Funktion:

ausblenden Delphi-Quelltext
1:
function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray;					


Deklaration

ausblenden volle Höhe 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:
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); // mehrere auf einmal um schneller arbeiten zu können
      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); // wirkliche Länge festlegen
end;


Und aufrufen kannst es dann so:

ausblenden 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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 19



BeitragVerfasst: 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
ausblenden 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); // ist das hier richtig?????
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 275

WinXP
BDS 2006
BeitragVerfasst: Mi 21.02.07 15:00 
user profile iconstefan1707 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
ausblenden 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); // ist das hier richtig?????
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 :D

gruss, Rob

_________________
erare humanum est
stefan1707 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 19



BeitragVerfasst: 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.

ausblenden 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



ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 21.02.07 18:35 
ausblenden Delphi-Quelltext
1:
2:
While s[i] = ' '  do  
delete(s,i,i);

->
ausblenden Delphi-Quelltext
1:
2:
While s[i] = #9  do  
delete(s,i,i);

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)