Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » HILFE: ganze textblöcke(zeilen) in einer txt-datei verschieben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
04.10.2004, 22:06 Uhr
enter-break



um ehrlich zu sein, in C wärs mir auch lieber, denn
in c++ werd ichs wohl wahrscheinlich nicht schaffen bis morgen abend :-((
da fehlt mir ein bischen zu viel hintergrundwissen, um die letzten
3 zeilchen noch im c++ fertig zu bekommen (da muss man sich bei den
schreibweisen ja komplett umstellen und neu gewöhnen) :-((
sieht für mich noch sehr kompliziert aus - was z.b. bedeutet das "::"

oh mann, wär ich glücklich wenn ich das mit meinem file endlich hätte (egal wie, ob in c oder c++)

wenn du (windalf) das so drauf hast, hilf doch bitte ausnahmsweise einem "unwissenden newbie", nachdem es dir ja wirklich schon locker von der hand geht.....

*schnief* (ich heul gleich vor frust)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
04.10.2004, 22:16 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


naja so schwer wars ja jetzt nicht mehr... ich bin sicher du wärst auch alleine drauf gekommen wenn du es dir richtig angeguckt hättest...
also genaugenommen hab ich da eigentlich gar nix programmiert... das macht alles die stl für mich... in c hätte man es ja selber machen müssen und nicht mal eben in 10-15 minuten hinklatschen können...
das ist halt das praktische an der stl die ist supermächtig und erlaubt mit wenig mächtigen befehlen viel abzuarbeiten... Ich bin fast sicher das virtual und Oxdeadbeef das auch mit einem noch kürzeren kryptischen einzeiler machen könnten...

C++:
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <algorithm>

int main() {
    std::string line;
    std::string file_in="test.txt";
    std::string file_out="test2.txt";
    std::string keyword1="bezug1";
    std::string keyword2="bezug2";
    std::vector<std::string> file;
    std::vector<std::string>::iterator i;
    std::vector<std::string>::iterator j;

    
    std::ifstream ifs(file_in.c_str());
    while(std::getline(ifs,line))
        file.push_back(line);
    ifs.close();

    for(i=file.begin();i!=file.end() && std::string::npos==i->find(keyword1);++i);
    for(j=++i;j!=file.end() && std::string::npos==j->find(keyword2);++j);
    std::ofstream ofs(file_out.c_str());
    std::copy(i, j, std::ostream_iterator<std::string>(ofs, "\n"));
    std::copy(file.begin(), i, std::ostream_iterator<std::string>(ofs, "\n"));
    std::copy(j, file.end(), std::ostream_iterator<std::string>(ofs, "\n"));
    ofs.close();
}



macht aus

C++:
zeile 1
zeile 2
zeile 3
zeile 4
zeile 5
zeile 6
zeile 7
bezug1####################
ölaskdöjflkadsöflkasdfökasjdf
ölaksdfölaskdöflkajsdölkfajsödlfj
ölaksdfölaksdfölk
bezug2####################
blablalba
zeile irgendwas
und
so weiter




C++:
ölaskdöjflkadsöflkasdfökasjdf
ölaksdfölaskdöflkajsdölkfajsödlfj
ölaksdfölaksdfölk
zeile 1
zeile 2
zeile 3
zeile 4
zeile 5
zeile 6
zeile 7
bezug1####################
bezug2####################
blablalba
zeile irgendwas
und
so weiter


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
04.10.2004, 22:30 Uhr
enter-break



jetzt bin ich baff - ist aber schon ziemlich kryptisch für mich
(wiegesagt bisher nur ein bischen in c rumgespielt)!!!!

ich werd das stück code auch gleich mal ausprobieren,
nur möcht ich jetzt auch kapieren, wie's funktioniert.

vor allem schiebt das (wenn ichs soweit verstanden hab)
immer ganz an den anfang ran .

ich brauch den verschobenen text aber eine zeile NACH
An: irgendwas@irgendwas

-> also muss doch

Code:

std::string keyword0="An:";



noch eingefügt werden und sich irgendwie die Zeilennummer jeweils
dazu mitgeliefert werden (damit man dann einfügt mit line+1(zeilennummer aus keyword0)

oder geht das auch wieder mit einem befehl (den ich mal wieder nicht kenn)??

noch was: kürzer dürfte der code gar nicht sein, sonst komm ich gar nicht mehr
mit, den morgigen tag damit zu verbringen mir sachen zu erklären wie:
std::ostream_iterator<std::string>()

-> kleine kommentare würden mir den lernfaktor sicher noch erleichtern.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
04.10.2004, 22:50 Uhr
enter-break



hab den letzten code von dir ausprobiert,
doch das problem ist auch,
dass die zeilen zwischen bezug1 und bezug2
öfter in der test.txt vorkommen und alles natürlich
dann oben steht, was nicht sein darf.

es sieht jedoch so aus, dass in der txt-datei
hunderte von emails nacheinander gespeichert sind
und eine neue mail immer mit
von: lakjdö@ölak.de
beginnt (also bezugspunkt ist "von:")

in jeder mail sind die zeilen zwischen "bezugspunkt1" und "bezugspunkt2"
enthalten, die eben nur nach oben unter die jeweilige "von"-Zeile
geschoben werden müssen.

denke, dass es nun schon kein 3zeiler mehr ist und schon
um einiges anspruchsvoller ist.

also wenn du noch da wärst und einem notleidenden aus der patsche helfen würdest....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
04.10.2004, 23:06 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


also pass auf...
das hier sollte hoffentlich klar sein...
ein iterator kannst du dir einfach als einen zeiger vorstellen...

C++:
    std::string line;
    std::string file_in="test.txt";
    std::string file_out="test2.txt";
    std::string keyword1="bezug1";
    std::string keyword2="bezug2";
    std::vector<std::string> file;
    std::vector<std::string>::iterator i;
    std::vector<std::string>::iterator j;




C++:
    std::ifstream ifs(file_in.c_str());
    while(std::getline(ifs,line))
        file.push_back(line);
    ifs.close();


das hier liest einfach nur die datei zeilenweise ins array file ein...
also nehmen wir mal an du hast eine datei in der drin steht

C++:
zeile1
zeile2
zeile3


dann sieht file nach dem einlesen wie folgt aus

C++:
file[0]="zeile1";
file[1]="zeile2";
file[2]="zeile3";


ist halt wie bei einem array...
so bis hier hin haben wir also ein array wobei jedes element des arrays eine zeile ist die als std::string gespeichert wird (ist sowas wie ein char-array nur das es automatisch die grösse anpasst)

so jetzt willst du in der datei nach stichworten suchen...

C++:
for(i=file.begin();i!=file.end() && std::string::npos==i->find(keyword1);++i);


file.begin() liefert dir quasi einen zeiger auf das erste element des arrays also auf dei erste zeile... i "zeigt" also aufs erste element...
dann sagst du so lange i noch nicht hinters letzte element zeigt (file.end() ) und in der zeile wo i sich gerade befindet nicht das gesuchte schlüsselwort ist lasse i auf die nächste zeile zeigen...
das heisst also wenn die schliefe durch ist, zeigt i entweder hinter das letzte arrayelement weil das keyword nicht gefunden wurde oder i zeigt auf die zeile in der das keyword ist...



C++:
for(j=++i;j!=file.end() && std::string::npos==j->find(keyword2);++j);


das hier ist das gleiche wie mit i nur das wir mit dem suchen nicht am anfang starten sondern ein element weiter als auf das was i zeigt...

wenn alles geklappt hat zeigt i also auf die zeile mit keyword1 und j auf die zeile mit keyword2


C++:
    std::copy(i, j, std::ostream_iterator<std::string>(ofs, "\n"));


das schriebt einfach alle zeilen die sich zwischen i und j befinden auf den stream ofs, was ja gerade die datei ist in die wir schreiben wollen....
diese befehle musst du nur entsprechend anpassen... also die zeiger angeben zwischen denen er was schreiben soll dann bekommst du das hin...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 04.10.2004 um 23:12 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
04.10.2004, 23:16 Uhr
(un)wissender
Niveauwart


@Windalf
Ich war ehrlich überrascht, du hast sogar std::string::npos statt -1 verwendet, da ist echt Fortschritt bei dir zu sehen, nachher biste nicht nur in Mathe gut, sondern auch im Programmieren.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
04.10.2004, 23:22 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@(un)wissender
aber für mich spricht das ich keine möglichen Fehler abgefangen habe
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
04.10.2004, 23:45 Uhr
enter-break



hi,

bitte schau mal, ob ich das einigermassen gecheckt hab:

ich füge also ein neues keyword ein, erstelle einen neuen zeiger auf die zeile mit dem keyword und sobald das keyword0 gefunden wurde, soll dieser das schreiben beginnen, sobald die zeilen zwischen keyword1 und keyword2 gefunden wurden.
also:


C++:
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <algorithm>

int main() {
    std::string line;
    std::string file_in="test.txt";
    std::string file_out="test2.txt";
    std::string keyword1="bezug1";
    std::string keyword2="bezug2";

    std::string keyword0="An:"; //

    std::vector<std::string> file;
    std::vector<std::string>::iterator x; // soll den zeiger zu keyword0 liefern
    std::vector<std::string>::iterator i;
    std::vector<std::string>::iterator j;

    
    std::ifstream ifs(file_in.c_str());
    while(std::getline(ifs,line))
        file.push_back(line);
    ifs.close();

        // ist das hier richtig? ein zeiger auf keyword0 ??
    for (x=file.begin();x!=file.end()&& std::string::npos==x->find(keyword0);++x);

    for(i=file.begin();i!=file.end() && std::string::npos==i->find(keyword1);++i);
    for(j=++i;j!=file.end() && std::string::npos==j->find(keyword2);++j);
    
    
    std::ofstream ofs(file_out.c_str());

    std::copy(i, j, std::ostream_iterator<std::string>(ofs, "\n"));
    std::copy(file.begin(), i, std::ostream_iterator<std::string>(ofs, "\n"));
    std::copy(j, file.end(), std::ostream_iterator<std::string>(ofs, "\n"));
    ofs.close();
}




hab auch versucht, einfach dann beim ausgeben dann so zu schreiben:


C++:
    std::copy(x, i, j, std::ostream_iterator<std::string>(ofs, "\n"));


hier fehlt aber dann noch ein "argument"

und, selbst wenns funktioniert rauscht mir das teil doch trotzdem über die ganze txtdatei, obwohl dieses doch nur zwischen An: und An: jeweils verschieben soll.

....das macht mich wahnsinnig.

Dieser Post wurde am 04.10.2004 um 23:50 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
04.10.2004, 23:53 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


also wichtig bei der sache ist zunächst mal das find case sensitiv ist... also beim keyword gross und kleinschreibung beachten...


C++:
for (x=file.begin();x!=file.end()&& std::string::npos==x->find(keyword0);++x);


also das sucht von anfang an nach der ersten zeile wo er keyword0 findet...
wenn du z.b. danach ein std::cout<<*x<<std::endl; verwendest kannst du spontan mal probieren ob er die von dir gewünschte zeile gefunden hat...


C++:
for(i=file.begin();i!=file.end() && std::string::npos==i->find(keyword1);++i);


hier fängst du wieder ganz von vorne an zu suchen... funktioniert auch aber wenn keyword1 erst nach keyword0 kommt dann würde ich i=x+1 setzen und nicht i=file.begin() weil sonst dauerts einfach mal nur unnötig länger...



C++:
std::copy(x, i, j, std::ostream_iterator<std::string>(ofs, "\n"));


das geht nicth so du darfst nur zwei iteratoren angeben nicht 3...
also wenn du z.b. alle zeilen zwischen x bis i ausgeben willst dann einfach


C++:
std::copy(x, i,std::ostream_iterator<std::string>(ofs, "\n"));//oder statt ofs  std::cout verwenden dann schreibt ers nicth in die datei sondern auf den bildschirm



wenn du nur eine zeile ausgeben willst kannst du wie bereits gesagt auch std::cout<<*x<<std::endl; oder wenn du es in die datei ofs<<*x<<std::endl; verwenden...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
05.10.2004, 00:31 Uhr
enter-break



vielen dank nochmal,

also - habs probiert, doch findet er leider immer nur einmal keyword0
(am bildschrim mal ausgegeben)

ich poste jetzt mal meine original datei:



Code:

Von: mail@server.de
Gesendet: Sonntag, 18. Januar 2004 21:43
An: enter@test.de
Betreff: Bestellung

#------ Order 91511 -------#
To=              enter@test.de
Datum=           18.1.2004,21:43:21
Remote_Addr=     99.999.999.999
TRNR=            91511
******** Artikel 1 *************
Anzahl=          5
Artikel=         0004
Bezeichnung=     Artikel01
Preis/Stk.=      2.30

******** Artikel 2 *************
Anzahl=          2
Artikel=         0002
Bezeichnung=     Artikel02
Preis/Stk.=      2.15

******** End ******************
------ Bestell Formular --------
Anrede=          Herrn
Firma=           -ohne-
Name=            Hans
Vorname=         Dampf
Strasse=         Hirschstraße 7
Land=            D
PLZ=             23111
Ort=             Orthausen
TelefonP=        07164-11111
EMail=           hans@dampf.com
URL=             Ja
##----- End ---------------------



Von: mail@server.de
Gesendet: Sonntag, 18. Januar 2004 22:43
An: enter@test.de
Betreff: Bestellung
#------ Order 90054 -------#
To=              enter@test.de
Datum=           18.1.2004,21:43:21
Remote_Addr=     99.999.999.999
TRNR=            90054
******** Artikel 1 *************
Anzahl=          1
Artikel=         0128
Bezeichnung=     Artikel5
Preis/Stk.=      1.95

******** Artikel 2 *************
Anzahl=          1
Artikel=         0129
Bezeichnung=     Artikel9
Preis/Stk.=      2.25

******** End ******************
------ Bestell Formular --------
Name=            Michael
Vorname=         Muster
Strasse=         Hanauer Str. 5
Land=            D
PLZ=             12345
Ort=             Musterhausen
EMail=           abc@muster.de
URL=             Ja
Bemerkung=       -ohne-
##----- End ---------------------




UND SO SOLLTE DIE DATEI AUSSEHEN:


Code:

Von: mail@server.de
Anrede=          Herrn
Firma=           -ohne-
Name=            Hans
Vorname=         Dampf
Strasse=         Hirschstraße 7
Land=            D
PLZ=             23111
Ort=             Orthausen
TelefonP=        07164-11111
EMail=           hans@dampf.com
URL=             Ja
Gesendet: Sonntag, 18. Januar 2004 21:43
An: enter@test.de
Betreff: Bestellung

#------ Order 91511 -------#
To=              enter@test.de
Datum=           18.1.2004,21:43:21
Remote_Addr=     99.999.999.999
TRNR=            91511
******** Artikel 1 *************
Anzahl=          5
Artikel=         0004
Bezeichnung=     Artikel01
Preis/Stk.=      2.30

******** Artikel 2 *************
Anzahl=          2
Artikel=         0002
Bezeichnung=     Artikel02
Preis/Stk.=      2.15

******** End ******************
------ Bestell Formular --------
##----- End ---------------------


Von: mail@server.de
Name=            Michael
Vorname=         Muster
Strasse=         Hanauer Str. 5
Land=            D
PLZ=             12345
Ort=             Musterhausen
EMail=           abc@muster.de
URL=             Ja
Bemerkung=       -ohne-
Gesendet: Sonntag, 18. Januar 2004 22:43
An: enter@test.de
Betreff: Bestellung
#------ Order 90054 -------#
To=              enter@test.de
Datum=           18.1.2004,21:43:21
Remote_Addr=     99.999.999.999
TRNR=            90054
******** Artikel 1 *************
Anzahl=          1
Artikel=         0128
Bezeichnung=     Artikel5
Preis/Stk.=      1.95

******** Artikel 2 *************
Anzahl=          1
Artikel=         0129
Bezeichnung=     Artikel9
Preis/Stk.=      2.25

******** End ******************
------ Bestell Formular --------
##----- End ---------------------



habs jetzt soweit, dass ich zumindest den jeweiligen Adress-Block ausgeschnitten hab in der ausgabe-datei, aber immer noch nicht jeweils an zeile x+1 (also eine Zeile NACH "Von:")
eingefügt.




Code:

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <algorithm>

int main() {
    std::string line;
    std::string file_in="test.txt";
    std::string file_out="test2.txt";
                        //std::string keyword1="bezug1";
                       //std::string keyword2="bezug2";
    std::string keyword1="------ Bestell Formular -------";
    std::string keyword2="##----- End --------------------";
    std::string keyword0="An:"; //

    std::vector<std::string> file;
    std::vector<std::string>::iterator x;
    std::vector<std::string>::iterator i;
    std::vector<std::string>::iterator j;

    
    std::ifstream ifs(file_in.c_str());
    while(std::getline(ifs,line))
        file.push_back(line);
    ifs.close();

        // ist das hier richtig? ein zeiger auf keyword0 ??
    for (x=file.begin();x!=file.end() && std::string::npos==x->find(keyword0);++x);
    std::cout<<*x<<std::endl; // hier zeigt er nur auf das erste Von:

   // for(i=file.begin();i!=file.end() && std::string::npos==i->find(keyword1);++i);
   for(i=x+1;i!=file.end() && std::string::npos==i->find(keyword1);++i);
    for(j=++i;j!=file.end() && std::string::npos==j->find(keyword2);++j);
    
    
    std::ofstream ofs(file_out.c_str());

    std::copy(x, i,std::ostream_iterator<std::string>(ofs, "\n"));//

    //std::copy(i, j, std::ostream_iterator<std::string>(ofs, "\n"));
    std::copy(file.begin(), i, std::ostream_iterator<std::string>(ofs, "\n"));
    std::copy(j, file.end(), std::ostream_iterator<std::string>(ofs, "\n"));

    ofs.close();
}



oh mann, mir brummt der schädel - schon 18 stunden nicht geschlafen und ich sterb gleich
*jammer*

Dieser Post wurde am 05.10.2004 um 00:33 Uhr von enter-break editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: