Autor |
Beitrag |
Blade29
Hält's aus hier
Beiträge: 5
|
Verfasst: 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..
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...
danke im vorraus
Mfg Ralf
|
|
sango
      
Beiträge: 236
WinXP Home
Delphi 2005 Pro
|
Verfasst: 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.
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
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Do 14.07.05 11:28
Und in Delphi geht's auch
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 
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
sango
      
Beiträge: 236
WinXP Home
Delphi 2005 Pro
|
Verfasst: Do 14.07.05 11:30
|
|
maxk
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Do 14.07.05 11:37
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
Blade29 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Do 14.07.05 15:08
Schreib doch zwischen Zeile 18 und 19 einfach noch: Delphi-Quelltext 1:
| AusgabeDatei:='Z:\MeinVerzeichnis\'+AusgabeDatei: |
Gruß,
maxk
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
Blade29 
Hält's aus hier
Beiträge: 5
|
Verfasst: Do 14.07.05 15:26
thx for all the goodies...
Mfg Ralf
|
|
sango
      
Beiträge: 236
WinXP Home
Delphi 2005 Pro
|
Verfasst: 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 
Hält's aus hier
Beiträge: 5
|
Verfasst: Fr 15.07.05 07:45
so sieht das komplette werk aus.... so ziemlich alles von hier nur gut geschüttelt nicht gerührt....
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 public 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:string; var 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; 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 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); AusgabeDatei:='D:\Test\PBF\'+AusgabeDatei; end; Ausgabe.Add(Strings[i]); end;
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 raziel: Code- durch Delphi-Tags ersetzt.
|
|
LeeChen
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 1068
Win 2000, Win XP
Delphi 7, Delphi 2005
|
Verfasst: Do 27.10.05 18:05
Hallo!
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
|
Verfasst: Fr 28.10.05 11:24
Hallo
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.
|
|