Autor Beitrag
Blade29
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 14.07.05 10:05 
Hallo zusammen...

habe ein problem ich muss aus einer datei bestimmte sachen auslesen und diese in jeweils eine neue datei
schreiben. die original datei sieht so aus..

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
#229-8320-5005-02-1
%t19635S
b900
#229-8320-5005-03-1
%t15584S
b900
t2677
o900
b161
t5530
b900
#229-8320-5005-04-1
%t30598S
b900


nun brauch ich
#229-8320-5005-02-1
%t19635S
b900

in einer datei die den namen 229-8320-5005-02-1.pbf hat..
und das mit allen einträgen ab # bis zur nächsten #... und die datei muss immer als namen
die zahl hinter der raute haben..

leider weiss ich nicht wie ich das anstellen soll... kann mir jemand helfen... :lol:

danke im vorraus


Mfg Ralf
sango
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 236

WinXP Home
Delphi 2005 Pro
BeitragVerfasst: Do 14.07.05 10:14 
ich weiss nicht wie man es in delphi genau macht, aber in php würde ich folgenden ansatz probieren

datei lesen,
erste zeile nehmen,
diesen wert nur die länge von 1(also 2. stelle) an und darauf dateinamen bilden.
dann solange die nachfolgenden zeilen reinschreiben bis das erste zeichen wieder ne raute ist.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
$lines = file($datei);
$dateihandle = NULL;
foreach ($lines as $line) {
  
  if(strpos('#',$line)===0) { // neue datei anfangen
    $dateinamen = substr($line, 1).".pbf";
    if($dateihandle!=NULL) { //wenn alte datei offen, diese schliessen
       fclose($dateihandle);
       $dateihandle = NULL;
    }
     $dateihandle = fopen($dateinamen, "w");
   } else {
     fputs($dateihandle, $line);
   }
   
}

also in php würde es so funktionieren(denk ich), vielleicht hilfts beim finden....
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Do 14.07.05 11:28 
Und in Delphi geht's auch ;)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure LeseAbschnitt(const Datei:string;Nr:integer);
var i:integer;
begin
 with TStringList.Create do try
  LoadFromFile(Datei);
  for i:=0 to Count-1 do begin
   if pos('#',Strings[i])=1 then begin
    if Nr=0 then Break;
    Dec(Nr);
   end;
   if Nr=0 then ShowMessage(Strings[i]);
  end;
 finally
  Free;
 end;
end;


Gruß,
maxk

// Edit: Hab dich falsch verstanden! Code es gleich nochmal :oops:

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
sango
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 236

WinXP Home
Delphi 2005 Pro
BeitragVerfasst: Do 14.07.05 11:30 
user profile iconmaxk hat folgendes geschrieben:
Und in Delphi geht's auch ;)

Gruß,
maxk

tja leider bin ich in delphi noch nicht so bewandelt wie in php :)
aber gehen tut alles,..... irgendwie ;)
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Do 14.07.05 11:37 
user profile iconmaxk hat folgendes geschrieben:
// Edit: Hab dich falsch verstanden! Code es gleich nochmal :oops:
Jetzt aber!
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:
procedure LeseAbschnitt(const Datei:string);
var i:integer;
    AusgabeDatei:string;
    Ausgabe:TStrings;
begin
 SetLength(AusgabeDatei,0);
 Ausgabe:=nil;
 with TStringList.Create do try
  Ausgabe:=TStringList.Create;

  LoadFromFile(Datei);
  for i:=0 to Count-1 do begin
   if pos('#',Strings[i])=1 then begin
    // Alte Datei speichern?
    if length(AusgabeDatei)>0 then Ausgabe.SaveToFile(AusgabeDatei);
    Ausgabe.Clear;
    AusgabeDatei:=TrimRight(Strings[i])+'.pbf';
    System.Delete(AusgabeDatei,1,1); // # entfernen
   end;
   Ausgabe.Add(Strings[i]);
  end;

  // Alte Datei speichern?
  if length(AusgabeDatei)>0 then Ausgabe.SaveToFile(AusgabeDatei);

 finally
  if Assigned(Ausgabe) then Ausgabe.Free;
  Free;
 end;
end;

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Blade29 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 14.07.05 13:15 
danke das hat super funktioniert....
aber leider baut er mir cr/lf ein... es dürfen aber nur cr drinsein...
kann man das noch irgendwie kombinieren??



Mfg ralf
Blade29 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 14.07.05 14:01 
ok ok hab es doch noch hinbekommen....
such nochwas das ich die files in ein anderes verzeichnis schreibt...
falls jemand schneller ist, als ich bitte posten... hab delphi5
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Do 14.07.05 15:08 
Schreib doch zwischen Zeile 18 und 19 einfach noch:
ausblenden Delphi-Quelltext
1:
AusgabeDatei:='Z:\MeinVerzeichnis\'+AusgabeDatei:					
;)

Gruß,
maxk

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Blade29 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 14.07.05 15:26 
thx for all the goodies... :lol:




Mfg Ralf
sango
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 236

WinXP Home
Delphi 2005 Pro
BeitragVerfasst: Do 14.07.05 16:11 
als gegenleistung kannst du uns ja jetzt noch sagen wie du die zeilenumbrüche anders gemacht hast, bzw deinen workaround. :)
Blade29 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 15.07.05 07:45 
so sieht das komplette werk aus.... so ziemlich alles von hier nur gut geschüttelt nicht gerührt.... :lol:


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:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    BTNkonvert: TButton;
    OpenDialog1: TOpenDialog;
    BTNende: TButton;
    procedure BTNkonvertClick(Sender: TObject);
    procedure BTNendeClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function file2string(filename:string):string;
var f: file of char;
    c:char;
begin
   result := '';
   if fileexists(filename) then
   begin
     assignfile(f,filename);
     reset(f);
     while not eof(f) do
     begin
       read (f,c);
       result := result + c;
     end;
     closefile(f);
   end;
end;

function strreplace(s,what, whit:stringvar count:integer):string;
var lastfound: integer;
begin
   count := 0;
   result := s;
   if (what = ''or (whit = ''then exit;
   lastfound := 0;
   while pos(uppercase(what), uppercase(copy(result,lastfound+1,length(result)))) > 0 do
   begin
     inc(count);
     lastfound := lastfound + pos(uppercase(what), uppercase(copy(result,lastfound+1,length(result))));
     result := copy(result,1,lastfound-1) + whit + copy(result,lastfound + length(what),length(result));
     lastfound := lastfound - (length(what)-length(whit));
   end;
end;

function string2file(filename, aString: string; appendmode:boolean):boolean;
var f: textfile;//file of char;
    i : integer;
begin
   assignfile(f,filename);
   if appendmode then append(f) else rewrite(f);
   for i := 1 to length(aString) do
     write(f,astring[i]);
   closefile(f);
   result := true;
end;

procedure TForm1.BTNkonvertClick(Sender: TObject);
var
 dateiname   : string;
 mystring    : string;
 c           : integer;
 i           :integer;
 AusgabeDatei: string;
 Ausgabe     : TStrings;


begin
  if OpenDialog1.Execute then
   begin
    dateiname := OpenDialog1.FileName;
    SetLength(AusgabeDatei,0);
    Ausgabe:=nil;
    with TStringList.Create do try
     Ausgabe:=TStringList.Create;
     LoadFromFile(dateiname);
     for i:=0 to Count-1 do begin
      if pos('#',Strings[i])=1 then begin
       // Alte Datei speichern?
       if length(AusgabeDatei)>0 then
         begin
          Ausgabe.SaveToFile(AusgabeDatei);
          mystring := file2string(AusgabeDatei);
          mystring:= strreplace(mystring,#13#10,#13,c);
          string2file (AusgabeDatei,mystring,false);
         end;
       Ausgabe.Clear;
       AusgabeDatei:=TrimRight(Strings[i])+'.pbf';
       System.Delete(AusgabeDatei,1,1); // # entfernen
       AusgabeDatei:='D:\Test\PBF\'+AusgabeDatei;
      end;
       Ausgabe.Add(Strings[i]);
     end;

     // Alte Datei speichern?
     if length(AusgabeDatei)>0 then
     begin
       Ausgabe.SaveToFile(AusgabeDatei);

     end;

    finally
     if Assigned(Ausgabe) then Ausgabe.Free;
     Free;
    end;
   end;
  end;

procedure TForm1.BTNendeClick(Sender: TObject);
begin
close;
end;

end.


danke nochmal für die prompte hilfe... selten so ein top board mit
solchen netten membern gesehen...


so long Ralf

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.
LeeChen
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 27.10.05 13:42 
Hi...sehr hilfreich dieser Thread. :-)

Meine Frage: Ist es möglich anstelle dieses Dateinamens -->229-8320-5005-02-1.pbf<-- den Quelltext so zu ändern das beim Speichern/konvertieren folgende Struktur anzulegen

d:\Testausgabe\pbf\229\8320\5005021.pbf

Also die ersten beiden Zahlenblöcke müssten Ordner werden und die letzten beiden quasi als Dateiname.pbf ohne die Bindestriche. Und wenn es ne Möglickeit geben würde zu prüfen ob es die Ordner schon gibt, wenn nein --> anlegen falls doch nur noch die Datei im richtigen Unterordner ablegen. Also falls man ne Zahlenreihe die die gleichen ersten 7 stellen hat z.B. 229-8320-5004-02-3 oder so ähnlich. Ist das verständlich? Ich hab heute leichte Ausdrucksschwierigkeiten ;)


Könnte mir bitte jemand ne Hilfestellung geben wo man welche Änderung in den Quelltext einarbeiten müsste. Ich wäre allen Helfern unendlich dankbar.
Martin1966
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1068

Win 2000, Win XP
Delphi 7, Delphi 2005
BeitragVerfasst: Do 27.10.05 18:05 
Hallo! :wink2:

Mit den Funktionen pos, copy und delete kannst du den String zerschneiden und einen neuen String (das Verzeichnis und den neuen Dateinamen) aufbauen.

Lg Martin

_________________
Ein Nutzer der Ecke ;-)
LeeChen
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 28.10.05 11:24 
Hallo :wave:

Tut mir leid hab aber leider gar keine Ahnug wie ich mit pos copy und delete den dateinamen so zerlegen kann, wie ich es brauche. Der Quelltext kann genauso bleiben wie er ist, naja bis auf die Änderung beim abspeichern. Mir qualmt schon der Kopf.