6741
23.01.2006, aktualisiert am 02.02.2006
10897
29
0
aus Textseite bestimmte Zeile herrauskopieren und ein Teil ersetzen oder löschen
Hallo,
ich muss aus einem sehr langen Text Teile kopieren und ersetzen oder etwas löschen.
Die Teile sind immer im "sdfsdfasfasdfasfd" Stil also wenn ich ein Tool hätte was mir diese Zeile im Semikolon herrauskopiert und dann noch einen Teil löscht würde mir das sehr sehr helfen. Es sind Scanndaten mit ca 600 bis 1000 Einträgen / Zeilen die ich wöchentlich filtern muss.
Ich hoffe mir kann einer helfen ...
Danke Schön !
ich muss aus einem sehr langen Text Teile kopieren und ersetzen oder etwas löschen.
Die Teile sind immer im "sdfsdfasfasdfasfd" Stil also wenn ich ein Tool hätte was mir diese Zeile im Semikolon herrauskopiert und dann noch einen Teil löscht würde mir das sehr sehr helfen. Es sind Scanndaten mit ca 600 bis 1000 Einträgen / Zeilen die ich wöchentlich filtern muss.
Ich hoffe mir kann einer helfen ...
Danke Schön !
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 24311
Url: https://administrator.de/contentid/24311
Ausgedruckt am: 22.11.2024 um 02:11 Uhr
29 Kommentare
Neuester Kommentar
Probier mal folgendes,
kannst du die Ersetzung von Hand in Word vornehmen? d.H. ich meine kannst den Text mit STRG-H suchen und ersetzen?
Wenn ja könntest du das mit dem Makro Rekorder in Word aufnehmen (Extras->Makro->aufzeichnen)
Jetzt hast schon den fertigen VB Code für suchen und ersetzen von Code. Jetzt nur noch in bisschen customizing und den Code ein paar mal oder in Schleifen angeordnet, fertig!!!
Versuch es erstmal so mit dem Makro Rekorder und anschließend was noch unklar ist posten.
Grüße und gute Nacht erstmal
kannst du die Ersetzung von Hand in Word vornehmen? d.H. ich meine kannst den Text mit STRG-H suchen und ersetzen?
Wenn ja könntest du das mit dem Makro Rekorder in Word aufnehmen (Extras->Makro->aufzeichnen)
Jetzt hast schon den fertigen VB Code für suchen und ersetzen von Code. Jetzt nur noch in bisschen customizing und den Code ein paar mal oder in Schleifen angeordnet, fertig!!!
Versuch es erstmal so mit dem Makro Rekorder und anschließend was noch unklar ist posten.
Grüße und gute Nacht erstmal
Hallo,
sorry, daß ich jetzt erst schreibe, aber eine fette Angina hat mich ans Bett genagelt.
Also ich schätze mal Du benutzt Windows. Dann mußt Du natürlich noch einen Perl-Interpreter installieren. Einen für Windows findest Du unter http://www.activestate.com/Products/ActivePerl/
Den hab ich allerdings selbst noch nicht installiert. Aber ich denke die haben ne gute Dokumentation.
Folgender Code sollte deine Aufgabe dann erfüllen:
Textdatei öffnen - Zeilenweise auslesen - Passende Zeilen in deine andere Datei schreiben
(EK1) bitte durch < ersetzen
(EK2) bitte durch > ersetzen
ZEILENANFANG durch den Anfang der Zeilen ersetzen, die du in der anderen Datei haben willst
Zur Erklärung:
open öffnet eine Datei. Mit > wird eine Datei überschrieben (bei TARGET z.B.). Wenn man stattdessen >> nimmt wird die Datei zum Anhängen geöffnet.
Die while-Schleife nimmt sich jede einzelne Zeile der Datei vor solange bis er am Ende der Datei angekommen ist.
Die if-Abfrage ist das Kernstück. In der Variablen $line wird nach dem regulären Ausdruck, der zwischen den beiden / steht, durchsucht. Wird der Ausdruck erfüllt gibts true, wenn nicht false. Das ^ sagt, das die Zeile mit der folgenden Zeichenkette beginnen muß. Also in diesem Fall würde sowohl die Zeile:
ZEILENANFANGdwg3737gr
als auch
ZEILENANFANG327tew7qgd3
erkannt. Nicht aber z.B.
32rg3gew
oder
ZEIL3248heqw
Wird der Ausdruck erfüllt wird die Zeile in die neue Datei geschrieben. Ist die Datei abgearbeitet, werden beide Dateien geschlossen.
Wenn Du noch fragen hast, nur her damit...
CIAO Thorsten
sorry, daß ich jetzt erst schreibe, aber eine fette Angina hat mich ans Bett genagelt.
Also ich schätze mal Du benutzt Windows. Dann mußt Du natürlich noch einen Perl-Interpreter installieren. Einen für Windows findest Du unter http://www.activestate.com/Products/ActivePerl/
Den hab ich allerdings selbst noch nicht installiert. Aber ich denke die haben ne gute Dokumentation.
Folgender Code sollte deine Aufgabe dann erfüllen:
Textdatei öffnen - Zeilenweise auslesen - Passende Zeilen in deine andere Datei schreiben
(EK1) bitte durch < ersetzen
(EK2) bitte durch > ersetzen
ZEILENANFANG durch den Anfang der Zeilen ersetzen, die du in der anderen Datei haben willst
open(SOURCE, "data.txt");
open(TARGET, "> filtered_data.txt");
while($line=(EK1)SOURCE(EK2))
{
if($line =~ m/^ZEILENANFANG/)
{
print TARGET $line;
}
}
close (SOURCE);
close (TARGET);
Zur Erklärung:
open öffnet eine Datei. Mit > wird eine Datei überschrieben (bei TARGET z.B.). Wenn man stattdessen >> nimmt wird die Datei zum Anhängen geöffnet.
Die while-Schleife nimmt sich jede einzelne Zeile der Datei vor solange bis er am Ende der Datei angekommen ist.
Die if-Abfrage ist das Kernstück. In der Variablen $line wird nach dem regulären Ausdruck, der zwischen den beiden / steht, durchsucht. Wird der Ausdruck erfüllt gibts true, wenn nicht false. Das ^ sagt, das die Zeile mit der folgenden Zeichenkette beginnen muß. Also in diesem Fall würde sowohl die Zeile:
ZEILENANFANGdwg3737gr
als auch
ZEILENANFANG327tew7qgd3
erkannt. Nicht aber z.B.
32rg3gew
oder
ZEIL3248heqw
Wird der Ausdruck erfüllt wird die Zeile in die neue Datei geschrieben. Ist die Datei abgearbeitet, werden beide Dateien geschlossen.
Wenn Du noch fragen hast, nur her damit...
CIAO Thorsten
Hi,
Wenn ich in diesem Forum eine Spitze öffnende Klammer mit direkt folgendem Text schreibe, dann erkennt er das als HTML-Tag und alles danach verschwindet. An dieser Stelle ist es aber wichtig, daß SOURCE ohne Leerzeichen von Spitzen Klammern umschlossen wird. Deshalb diese Ersetzungssache.
Ganz genau...
Also hab ich das jetzt richtig verstanden, daß Du in dem genannten Fall in der filtered_data.txt folgenden Eintrag haben willst:
ZEILENANFANGasfdsfw4fsdfsdfasf4dasdad
Wenn das so ist, dann machst Du folgende kleine Änderung in deinem Code:
Ursprungscode:
Änderung:
s/abc;// ersetzt alle Vorkommen von "abc;" durch ""
oder anders gesagt:
s/A/B/ ersetzt alle vorkommen von A durch B
Freut mich. Für solche Auswertungsgeschichten ist Perl einfach ungeschlagen.
Welche Sprache man nimmt, hängt grundlegend von der Aufgabenstellung ab. Denn es gibt nicht nur verschiedene Sprachen, sondern auch verschiedene Gruppen von Sprachen, die für verschiedene Aufgaben besser oder schlechter geeignet sind.
Scriptsprachen wie Perl und Python
Funktionale Sprachen wie SML, OCaml oder Haskell
Imperative Sprachen wie Basic, C oder TurboPascal kleiner Version 6
Objektorientierte Sprachen wie C++, Java
Da muß ich jetzt zugeben, daß ich die Frage nicht verstanden habe. Muß es jetzt bis zum Semikolon oder ab dem Semikolon gelesen werden? Am besten ist, du sagst, was bei einer solchen Zeile nachher in der gefilterten Ausgabe stehen soll...
CIAO Thorsten
Du schreibst, dass ich (EK1) bzw (EK2)
ersetzen soll. Sorry jetzt noch dumm
gefragt, warum ??
ersetzen soll. Sorry jetzt noch dumm
gefragt, warum ??
Wenn ich in diesem Forum eine Spitze öffnende Klammer mit direkt folgendem Text schreibe, dann erkennt er das als HTML-Tag und alles danach verschwindet. An dieser Stelle ist es aber wichtig, daß SOURCE ohne Leerzeichen von Spitzen Klammern umschlossen wird. Deshalb diese Ersetzungssache.
Die data.txt ist die Ausgangsdatei, in die
filtered_data.txt sind alles gefundenen
Datensätze die mit ZEILENANFANG
anfangen.
filtered_data.txt sind alles gefundenen
Datensätze die mit ZEILENANFANG
anfangen.
Ganz genau...
Eine weitere Frage wäre ich möchte
danach, oder auch sofort aus den gefundenen
Zeilen genau eine Kombiniation aus
Buchstaben und Zeichen rausnehmen.
zb. :
ZEILENANFANGasfdsfw4fsdfsdfasf4abg;dasdad
Hier müsste aus jeder Zeile das abg;
gelöscht werden.
danach, oder auch sofort aus den gefundenen
Zeilen genau eine Kombiniation aus
Buchstaben und Zeichen rausnehmen.
zb. :
ZEILENANFANGasfdsfw4fsdfsdfasf4abg;dasdad
Hier müsste aus jeder Zeile das abg;
gelöscht werden.
Also hab ich das jetzt richtig verstanden, daß Du in dem genannten Fall in der filtered_data.txt folgenden Eintrag haben willst:
ZEILENANFANGasfdsfw4fsdfsdfasf4dasdad
Wenn das so ist, dann machst Du folgende kleine Änderung in deinem Code:
Ursprungscode:
if($line =~ m/^ZEILENANFANG/)
{
print TARGET $line;
}
Änderung:
if($line =~ m/^ZEILENANFANG/)
{
$line =~ s/abc;//;
print TARGET $line;
}
s/abc;// ersetzt alle Vorkommen von "abc;" durch ""
oder anders gesagt:
s/A/B/ ersetzt alle vorkommen von A durch B
Vorab erstmal dankeschön und ich
erkenne was man alles machen kann und werde
mich wohl mal mehr damit beschäfitgen.
erkenne was man alles machen kann und werde
mich wohl mal mehr damit beschäfitgen.
Freut mich. Für solche Auswertungsgeschichten ist Perl einfach ungeschlagen.
Aber was interessant ist ist sicher auch die
Frage, welche Sprache nimmt man ...
Frage, welche Sprache nimmt man ...
Welche Sprache man nimmt, hängt grundlegend von der Aufgabenstellung ab. Denn es gibt nicht nur verschiedene Sprachen, sondern auch verschiedene Gruppen von Sprachen, die für verschiedene Aufgaben besser oder schlechter geeignet sind.
Scriptsprachen wie Perl und Python
Funktionale Sprachen wie SML, OCaml oder Haskell
Imperative Sprachen wie Basic, C oder TurboPascal kleiner Version 6
Objektorientierte Sprachen wie C++, Java
Ach was ich grade noch sehe, was ist wenn
der Ausdruck den ich suche so aussieht
"ZEILENANFGANGasdadasd234342asdaabg;addsadadaasd"
jetzt darf die Zeile nur vom Anfang des
Semikolons gelesen werden und dann nur bis
zum Ende des Zemikolons und wie oben
beschreiben das abg; ( zb) herrausgefilter /
gelöscht weren.
der Ausdruck den ich suche so aussieht
"ZEILENANFGANGasdadasd234342asdaabg;addsadadaasd"
jetzt darf die Zeile nur vom Anfang des
Semikolons gelesen werden und dann nur bis
zum Ende des Zemikolons und wie oben
beschreiben das abg; ( zb) herrausgefilter /
gelöscht weren.
Da muß ich jetzt zugeben, daß ich die Frage nicht verstanden habe. Muß es jetzt bis zum Semikolon oder ab dem Semikolon gelesen werden? Am besten ist, du sagst, was bei einer solchen Zeile nachher in der gefilterten Ausgabe stehen soll...
CIAO Thorsten
Hi Thorsten,
es gibt Zeilen die sehen so aus:
Der Zeileanfang ist immer gleich.
"Zeilenanfangs6a7d67d7as67ds7darg;sdasdsdasdas"
ich möchte alle Zeilen ab dem Semikolon
mit dem selben Zeilenanfang bis zum Ende (
Semicolon ) auslesen und in die Testdatei
speichern.
es gibt Zeilen die sehen so aus:
Der Zeileanfang ist immer gleich.
"Zeilenanfangs6a7d67d7as67ds7darg;sdasdsdasdas"
ich möchte alle Zeilen ab dem Semikolon
mit dem selben Zeilenanfang bis zum Ende (
Semicolon ) auslesen und in die Testdatei
speichern.
Das hab ich immernoch nicht verstanden, sorry. Das einzige Semikolon, das ich da sehe ist das hinter "arg".
Kannst Du vielleicht einen Auszug aus der Datei posten und was du als Ergebnis für diesen auszug erwartest?
Im einen weiteren Durchgang oder
auch sofort etwas löschen, aus der
gefilterten Zeile zb ( arg; ) muss komplett
gelöscht werden.
auch sofort etwas löschen, aus der
gefilterten Zeile zb ( arg; ) muss komplett
gelöscht werden.
Nun das ist ja wie bereits beschrieben kein Problem...
CIAO Thorsten
Ok, kannst wieder groß werden. Kann ja jedem mal passieren... Allerdings stellt sich mir jetzt noch folgende Frage:
Sieht deine Datei so aus:
oder so:
CIAO Thorsten
Sieht deine Datei so aus:
"BLAeuwhiuhdwieuf;fewiubiuwe"
"BLAfwiuehdwewffeuwzgwefuwe"
"BLAdewiewuzfieuzhiuewhdieuwh"
oder so:
"BLAewzudiweuf;wefhdiweuh
BLAuewhfiehwfiuewhfuhewu
BLAdewihfeowuhfoewuoiewjf"
CIAO Thorsten
hallo,
ok, jetzt wirds langsam kompliziert
Nehmen wir also mal das was du geschrieben hast:
dann soll daraus folgendes werden in der filtered_data.txt (euf; rausgefiltert):
Richtig?
Wenn das der Fall ist, würde ich wiefolgt vorgehen:
Schritt 1: jedes " durch einen Zeilenumbruch ersetzen. Dann hätte man sowas:
Das bläst die Datei erstmal auf, da viele neue Zeilen dazu kommen. Danach würde ich dann das bereits geschriebene Script drauf anwenden. Dabit werden schonmal alle Zeilen die nicht mit BLA beginnen entfernt und die definierte Zeichenkette (z.b. euf;) entfernt.
Wenn ich das jetzt korrekt verstanden habe, sag nochmal bescheid und ich passe das alte Script daran an und poste es nochmal...
CIAO Thorsten
ok, jetzt wirds langsam kompliziert
Nehmen wir also mal das was du geschrieben hast:
"BLAeuwhiuhdwieuf;fewiubiuwe" sdada
asasdd " asasds " "BLAfwiuehdwewffeuwzgwefuwe"
"BLAdewiewuzfieuzhiuewhdieuwh" 98asd9asddddd
asasdd " asasds " "BLAfwiuehdwewffeuwzgwefuwe"
"BLAdewiewuzfieuzhiuewhdieuwh" 98asd9asddddd
dann soll daraus folgendes werden in der filtered_data.txt (euf; rausgefiltert):
BLAeuwhiuhdwifewiubiuwe
BLAfwiuehdwewffeuwzgwefuwe
BLAdewiewuzfieuzhiuewhdieuwh
Richtig?
Wenn das der Fall ist, würde ich wiefolgt vorgehen:
Schritt 1: jedes " durch einen Zeilenumbruch ersetzen. Dann hätte man sowas:
BLAeuwhiuhdwieuf;fewiubiuwe
sdada
asasdd
asasds
BLAfwiuehdwewffeuwzgwefuwe
BLAdewiewuzfieuzhiuewhdieuwh
98asd9asddddd
Das bläst die Datei erstmal auf, da viele neue Zeilen dazu kommen. Danach würde ich dann das bereits geschriebene Script drauf anwenden. Dabit werden schonmal alle Zeilen die nicht mit BLA beginnen entfernt und die definierte Zeichenkette (z.b. euf;) entfernt.
Wenn ich das jetzt korrekt verstanden habe, sag nochmal bescheid und ich passe das alte Script daran an und poste es nochmal...
CIAO Thorsten
Wenn man jetzt die Zeilen hat würde ich
gerne die Zeile löschen die kein amp; in
der Zeile haben löschen.
Nachdem alle Zeilen stehen bleiben muss amp;
aus der Zeile gelöscht werden.
gerne die Zeile löschen die kein amp; in
der Zeile haben löschen.
Nachdem alle Zeilen stehen bleiben muss amp;
aus der Zeile gelöscht werden.
Ich dachte die Zeile soll mit was bestimmtem beginnen?!? Die beiden Zeilen, die bei dir jetzt am Ende rauskommen, fangen aber verschieden an. Wäre schon wichtig, das zu wissen, nach welchen Kriterien Zeilen jetzt behalten werden oder nicht. Ansonsten hab ich das Script fertig. Ist etwas umfangreicher geworden. Würde es daher gerne nur einmal Posten, nämlich wenn wir sicher sind, daß es auch paßt (Muß ja wegen der ollen Klammern immer noch ein wenig dran rumändern).
CIAO Thorsten
Hallo, also das angepaßte Script lautet wiefolgt:
Auch hier (EK1) durch < und (EK2) durch > ersetzen (ist diesmal an zwei Stellen der Fall). Deinen "Auswahlparameter", also die Zeichenkette, nach der Zeilen ausgesucht werden sollen und die nachher aus der Zeile entfernt werden soll, schreibst Du in die Variable $searchparam einfach das efg; in dem Code oben durch die entsprechende Zeichenkette ersetzen.
Das Script schreibt zunächst die einzelnen Zeilen in eine neue Datei preprocessed.txt. Danach werden diese anhand des Parameters durchsortiert und entsprechend "bereinigt". In der filtered_data.txt findest Du dann die Ausgabe, mit der Du dann (hoffentlich) weiterarbeiten kannst. Noch Fragen?
Würde mich freuen, wenn dir das hilft und Du mir eine gute Bewertung geben würdest.
CIAO Thorsten
$searchparam = "efg;";
open(SOURCE, "data.txt");
open(TEMP, "> preprocessed.txt");
while($line=(EK1)SOURCE(EK2))
{
$line =~ s/(")/\n/g;
print TEMP $line;
}
close (SOURCE);
close (TEMP);
open(SOURCE, "preprocessed.txt");
open(TARGET, "> filtered_data.txt");
while($line=(EK1)SOURCE(EK2))
{
if($line =~ m/($searchparam)/)
{
$line =~ s/($searchparam)//g;
print TARGET $line;
}
}
close (SOURCE);
close (TARGET);
Auch hier (EK1) durch < und (EK2) durch > ersetzen (ist diesmal an zwei Stellen der Fall). Deinen "Auswahlparameter", also die Zeichenkette, nach der Zeilen ausgesucht werden sollen und die nachher aus der Zeile entfernt werden soll, schreibst Du in die Variable $searchparam einfach das efg; in dem Code oben durch die entsprechende Zeichenkette ersetzen.
Das Script schreibt zunächst die einzelnen Zeilen in eine neue Datei preprocessed.txt. Danach werden diese anhand des Parameters durchsortiert und entsprechend "bereinigt". In der filtered_data.txt findest Du dann die Ausgabe, mit der Du dann (hoffentlich) weiterarbeiten kannst. Noch Fragen?
Würde mich freuen, wenn dir das hilft und Du mir eine gute Bewertung geben würdest.
CIAO Thorsten
Hallo,
also unter der Voraussetzung, daß Du Perl installiert hast, ist das "relativ" einfach. Du machst eine Text-Datei, in die Du den Code reinschreibst (diese muß im gleichen Verzeichnis liegen, wie deine data.txt). Ich lasse meine Perlscripte immer auf .pl enden, ist aber sicher kein muß. Da Perl eine Interpretersprache ist (d.h. der Code wird nicht compiliert), mußt Du Perl jetzt nur noch mit dem Script füttern. Das geht am einfachsten über die Kommandozeile (ich hoffe die kennst Du und kennst dich damit ein wenig aus). Öffnen tust Du die über "Start > Ausführen" mit dem Befehl "cmd".
Hast Du diese Konsole offen, gehst Du in das Verzeichnis, in dem deine data.txt und das Script liegen. Dort gibst Du dann ein
"C:/Perl/perl script.pl"
wobei C:/Perl der Pfad ist in dem Du Perl installiert hast und script.pl die Datei, die das Script enthält.
CIAO Thorsten
also unter der Voraussetzung, daß Du Perl installiert hast, ist das "relativ" einfach. Du machst eine Text-Datei, in die Du den Code reinschreibst (diese muß im gleichen Verzeichnis liegen, wie deine data.txt). Ich lasse meine Perlscripte immer auf .pl enden, ist aber sicher kein muß. Da Perl eine Interpretersprache ist (d.h. der Code wird nicht compiliert), mußt Du Perl jetzt nur noch mit dem Script füttern. Das geht am einfachsten über die Kommandozeile (ich hoffe die kennst Du und kennst dich damit ein wenig aus). Öffnen tust Du die über "Start > Ausführen" mit dem Befehl "cmd".
Hast Du diese Konsole offen, gehst Du in das Verzeichnis, in dem deine data.txt und das Script liegen. Dort gibst Du dann ein
"C:/Perl/perl script.pl"
wobei C:/Perl der Pfad ist in dem Du Perl installiert hast und script.pl die Datei, die das Script enthält.
CIAO Thorsten
@6741,
da wäre doch mal ne Bewertung fällig!
Psycho
Klug ist jeder - der eine vorher, der andere hinterher
da wäre doch mal ne Bewertung fällig!
Psycho
Klug ist jeder - der eine vorher, der andere hinterher
Na dann gib ihm doch endlich die fünf Sterne!
Psycho
Klug ist jeder - der eine vorher, der andere hinterher
Psycho
Klug ist jeder - der eine vorher, der andere hinterher
Werde mir wohl ein Buch über Perl
für Anfänger mal zulegen ....
für Anfänger mal zulegen ....
Also Buchmäßig kann ich dir Bücher von O'Reilly empfehlen. Da gibt es derer drei:
1) Einführung in Perl (ist ein Lama vorne drauf)
Das war mein erstes Perl-Buch
2) Programmieren in Perl (mit nem Dromeda drauf)
Hab ich nicht gelesen, aber beim durchstöbern des Inhaltsverzeichnisses bei Amazon macht es einen ganz guten Eindruck
3) Das Perl Kochbuch (mit nem Widder-ähnlichen Tier)
In diesem Buch gibts im wahrsten Sinne des Wortes "Rezepte". Es wird eine Frage gestellt und darauf die Lösung erklärt. Ist eher ne Referenz oder was zum Anregungen holen, wenn man eigentlich schon Perl kann. Wie in einem echten Kochbuch kann man auch bei diesen Rezepten immer ein wenig variieren.
Oder kennst Du einen guten Link
Recht nett geschrieben findest Du was unter http://www.tekromancer.com/
Sollte als erste Kost genügen, denn die O'Reilly Bücher sind i.A. nicht unbedingt günstig zu haben.
was müsste ich ändern, wenn man
etwas vor jede Zeile bzw ans Ende
ergänzen wollte?
etwas vor jede Zeile bzw ans Ende
ergänzen wollte?
Vor jede Zeile ist recht einfach. Bevor Du die bearbeitete Zeite mit "print TARGET $line" in die Datei endgültige Datei schreibst, fügst Du noch folgende Zeile ein:
$line = "ABC" . $line;
Das hinten anfügen ist etwas schwieriger, da eine Zeile am Ende noch ein Steuerzeichen für den Zeilenumbruch hat. D.h. erst den Zeilenumbruch wegmachen und dann das Anzuhängende + einen Umbruch anhängen:
chomp($line);
$line = $line . "ABC\n";
Also würde dein Code z.B. so aussehen:
...
$line =~ s/($searchparam)//g;
chomp($line);
$line = $line . "ABC\n";
print TARGET $line;
...
Freut mich, daß ich helfen konnte
CIAO Thorsten