Entwickler-Ecke
Dateizugriff - datei in string laden, aber so wie notepad
ShoAn - Fr 10.10.03 10:23
Titel: datei in string laden, aber so wie notepad
hallo,
ich hab ein problem, und zwar wei ich nicht wie ich eine date (zb. doc) in ein string speichern kann. so dass das dann aussieht, als wrde ich die datei mit notpad ffnen.
also wenn ich die datei zb mit assignfile, reset, readln, usw in ein memo einlese bekomm ich nur sowas:
aber da mit kann ich nix anfangen.
Klabautermann - Fr 10.10.03 10:35
Hallo,
Moment, willst du selber Dateien Speichern und diese dann lesen oder mchtest du Winwords *.doc Dateien ffnen?
Gru
Klabautermann
ShoAn - Fr 10.10.03 11:06
nene, speichern wollt ich nichts.
also letztendlich will ich ein suchscript schreiben. dass ich, wie bei google, bestimmte suchbegriffe eingebe. und mein script soll dann doc und txt dateien nach den wrtern suchen. dann soll der die dateien auflisten, aber sortiert nach der hufigkeit, wie oft die suchwrter vorkommen.
naja bis dahin isses noch weit ;)
erstmal muss ich versuchen doc-dateien auszulesen :)
mimi - Fr 10.10.03 11:27
das wird nicht einfach, weil doc dateien sind biny aufgebaut, und du musst wissen wie der header aussieht und welche version diese doc datei ist, sonst bringt das nichts, und das ist ein aufwand. selbst mit TFileStream dauert das seine zeit :(
Klabautermann - Fr 10.10.03 12:05
Hallo,
ich kann Mimi nur zustimmen. (Winword) Doc-Dateien sind nicht ohne, da sie auch von Winword Version zu Version unterschiedlich sind (um Konkurrenten das Schreiben von Import filtern zu erschweren). Daher ist es enorm aufwndig soetwas selbst zu machen. Alternativ kannst du natrlich Winword Fernsteuern und es zum Suchen Missbrauchen. Dann muss der Anwender aber neben deinem Programm auch Winword installiert haben.
Gru
Klabautermann
ShoAn - Fr 10.10.03 12:06
aber wieso denn?
notpad kann auch doc dateien ffnen, da is zwar noch ziehmlich viel mll dabei, aber auch der richtige text. und den brauch ich ja.
das kannst du selbest ausprobiern, indem du notpad startest, auf datei und ffnen klickst. dann bei dateityp alle dateien auswhlen. markier dann ne doc-datei und ffne sie.
nur, wie macht das notpad??
BungeeBug - Fr 10.10.03 12:09
Hi,
ich denk mal das einfachste ist wenn du nen Memo nimmst und dann die Datei eifach so ffnest
Delphi-Quelltext
1: 2: 3: 4:
| IF OpenDialog1. Execute THEN BEGIN Memo1.LoadFormFile(OpenDialog1.FileName); END; |
Du bracust eben nen Memo und nen Opendialog :)
barfuesser - Fr 10.10.03 12:33
Aber auch damit wird er die Worddatei nicht in lesbarer Form erhalten.
barfuesser
Tino - Fr 10.10.03 12:56
barfuesser hat folgendes geschrieben: |
Aber auch damit wird er die Worddatei nicht in lesbarer Form erhalten. |
Ich glaube das wollte ShoAn auch nicht:
ShoAn hat folgendes geschrieben: |
notpad kann auch doc dateien ffnen, da is zwar noch ziehmlich viel mll dabei, aber auch der richtige text. und den brauch ich ja. |
Gru
Tino
ShoAn - Fr 10.10.03 13:21
ich hab mir jetzt mal eine test.doc datei gemacht. also in word eine neu datei erstellt. dann hab ich ganz normal geschrieben:
Zitat: |
Dies ist ein Test. |
so, nun ffne ich die datei mit notepad, und ich sehe das (musste ein wenig krzen, sonst htt ich hier das templet zerstrt):
Zitat: |
ࡱ > ! # 9 bjbj . l - $
uR 0 -
Dies ist ein Test.
, 1h. A!"#$n%
i < @ < S t a n d a r d CJ _HaJ mHsHtH B A@ B A b s a t z - S t a n d a r d s c h r i f t a r t 0 D o m i n i k W i n t e r 7 C : \ D o k u m e n t e u n d E i n s t e l l u n g e n \ D o m i n i k \ D e s k t o p \ t e s t . d o c @ |t P @ U n k n o w n G z T i m e s N e w R o m a n 5 S y m b o l 3& z A r i a l " FSzGSz ! 0 2 D i e s i s t e i n T e s t D o m i n i k W i n t e r D o m i n i k W i n t e r Oh +'0 t <
H T \ d l Dies ist ein Test d ies Dominik Winter s omi omi Normal.dot t Dominik Winter s 1 mi Microsoft Word 9.0 @ ܬ|@ "p ՜. +,0 h p
DevITES GmbH n
Dies ist ein Test Titel
" R o o t E n t r y F @!z$ 1 T a b l e W o r d D o c u m e n t S u m m a r y I n f o r m a t i o n ( D o c u m e n t S u m m a r y I n f o r m a t i o n 8 C o m p O b j j O b j e c t P o o l @!z@!z
F Microsoft Word-Dokument
MSWordDoc Word.Document.8 9q |
und wenn ich nun mit loadfromfile versuche ins memo zu laden hab ich nur das:
so, und ich brauch das, was notpad macht, um wenigstens an den text zu kommen. die ganzen sonderzeichen kann man ja irgendwie noch rausfiltern, wenn ich an den text gekokmmen bin ;)
in php gibt es eine ganz tolle funktion die "file_get_contents()" heit, aber die gibts leider nicht bei delphi :-/
ps: sorry fr die vielen qutes
mimi - Fr 10.10.03 14:30
wenn es darauf nur ankkommt kannst du folgendes machen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure LoadFile(FIleName:String); var Stream:TFileStream; begin Stream:=TFileStram.Create(FileName, fmOpenRead); Memo1.LoadFromStream(Stream); Stream.Free; end; |
ShoAn - Fr 10.10.03 14:51
habs genau so gemacht, musst nur noch bei "stram" ein "e" reinmachen und nach "memo1." noch ein "lines." ;)
aber da macht der genau das gleiche:
das gibts doch net, ich werd hier noch ganz verrckt :eyecrazy:, notepad is verhext
Klabautermann - Fr 10.10.03 15:10
Hallo,
vieleicht solltest du den Stream Byteweise durchgehen und nur die Bytes, die erlaubte Zeichen enthalten, deinem Memo hinzufgen. Damit drften dann sonderzeichen, die das verhalten des Memos stren von diesem fern gehalten werden.
Gru
Klabautermann
ShoAn - Fr 10.10.03 15:15
@Klabautermann:
ich glaub, dass mit dem byteweise auslesen brauch ich nicht, htt ich sowieso net gekonnt ;)
ich hab einfach mal aus spa ein richedit anstatt ein memo feld genommen. und aufeinmal seh ich was :D
Anonymous - Fr 10.10.03 15:35
wahrscheinlich kommt in der datei ein #0 vor. der text dahinter wird von tmemo einfach abgeschnitten.
ShoAn - Fr 10.10.03 15:39
hm, kann sein ;)
naja, jetzt bleibt nur noch die frage: wie suche ich ein teilstring in einem tstream?
oder noch besser wre natrlich eine funktion, die mir die anzahl der gefundenen wrter ausgibt, aber das kann man sich zu not selbst programmiern ;)
Anonymous - Fr 10.10.03 15:59
nur das erste vorkommen? dann nimm "Pos"
ansonsten wirds ein bissl komplizierter, aber ist immer noch machbar
mimi - Fr 10.10.03 16:04
wenn er mit Streams arbeitet kann er schlecht pos nutzen, so eine funktion brauche ich auch noch dringend, aber ich habe keine idee wie sie aufgebaut sein knnte :(
am besten wre ja, wenn er einen eingen word anzeige programm schreiben wrde.
Anonymous - Fr 10.10.03 16:11
er muss den string erst einlesen, anders gehts nicht.
ich hab aber mal eben eine Fkt geschrieben, die alle Vorkommen eines Teilstrings in einem String sucht.
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:
| type TIntArray = array of integer;
function Search_all(substr: string; str: string): TIntArray; var s,s2,s3: pchar; idx: integer; begin s := pchar(str); s2 := pchar(substr); idx := 1; repeat if s^ = s2^ then begin s3 := pchar(str); inc(s3,idx-1); while (s2^ <> #0) and (s3^ <> #0) and (s2^ = s3^) do begin inc(s2); inc(s3); end; if (s2^ = #0) then begin setlength(result,length(result)+1); result[high(result)] := idx; end; s2 := pchar(substr); end; inc(s); inc(idx); until s^ = #0; end; |
ShoAn - Fr 10.10.03 16:32
hey, cool, danke :D
kann aber das leider erst am montag testen.
also bis dahin ..
Anonymous - Fr 10.10.03 16:34
hier noch was zum Wrter zhlen:
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:
| type TCharSet = set of char;
const def_charset = [' ']; charset_all = [#0..#255];
function wordcount(s: string; nw: TCharSet = def_charset): integer; var p: pchar; new: boolean; begin p := pchar(s+' '); result := 0; new := false; repeat if not (p^ in charset_all-nw) then if not new then begin inc(result); new := true; end else else new := false; inc(p); until p^ = #0; end; |
und zum ersetzen (wo ich grad schon dabei bin ;) )
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:
| function replace_all(search: string; replace: string; str: string): string; var f: TIntArray; p: integer; slength: integer; s: pchar; idx: integer; begin p := 0; f := Search_all(search,str); slength := length(search); s := pchar(str); result := ''; idx := 1; repeat if p > high(f) then while s^ <> #0 do begin result := result + s^; inc(s); end else begin if f[p] = idx then begin inc(idx, slength); inc(s, slength); inc(p); result := result + replace; end else begin result := result + s^; inc(idx); inc(s); end; end; until s^ = #0; end; |
[/delphi]
ShoAn - Mo 13.10.03 11:08
hallo, schnen dank fr die funktionen :)
aber wie sieht denn der funktionsaufrauf fr "wordcount" aus? das erste is doch der gesamte string und das zeite der gesuchte string oder? nur wie bergeb ich das?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beitrge stammen von dritten Personen und drfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehrigen Webseiten distanzieren sich ausdrcklich von Fremdinhalten jeglicher Art!