String aus Textdatei in neue .txt schreiben

Schrumpfi

Lt. Commander
Dabei seit
Jan. 2011
Beiträge
1.315
Hallo zusammen,
ich habe ein Textdatei, aus der ich bestimme Zeilen der Übersicht wegen in eine neue Datei herausschreiben möchte..
Nun ist aber nur der Anfang dieses "Strings" bekannt, also sollte das Programm, womit auch immer ich das hinbekomme, nach dem ersten Teil (z.B. "USER") suchen und dann die komplette Zeile nehmen und sie in eine Textdatei kopieren..
Allerdings weiß ich nicht, ob das mit einem speziellen Texteditor schon funktioniert, oder ob ich da selbst noch was programmieren muss.
Wäre sehr dankbar, wenn ihr mir da helfen könntet!
l.G. Schrumpfi
 

Fireball89

Captain
Dabei seit
Aug. 2007
Beiträge
3.498
Also ich benutze Crimson Editor als Texteditor und dessen Makro-Funktion kann sowas NICHT.
Ich rate dir dich kurz in AutoIT einzulesen. Damit sind das weniger als 10 Zeilen Programmcode.
 

Schrumpfi

Lt. Commander
Ersteller dieses Themas
Dabei seit
Jan. 2011
Beiträge
1.315
Ohje das dürfte klappen, aber es dürfte einige Zeit dauern, bis ich mich mal eingelesen habe darein..
Kennt sich jemand so gut damit aus, dass er mir kurz ein Beispiel schreiben kann??
Das Größte Problem sehe ich darin, dass ich die komplette Zeile brauche, die mit diesem "USER" anfängt..
 

SaxnPaule

Commodore
Dabei seit
Okt. 2010
Beiträge
4.374
Pfade anpassen, mit javac kompilieren und ausführen ;)

Geht sicherlich mit anderen Programmen mit weniger Zeilen Code. Aber wenn man ein wenig Java kann ist das eine Sache von 3 Minuten, was 1000x schneller geht, als sich stundenlang in andere Programme einzuarbeiten.


Code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class TextExtractor {

    public static void main(String[] args) {
        File fileIn = new File("C:\\Temp\\fileIn.txt");
        File fileOut = new File("C:\\Temp\\fileOut.txt");
        
        if(!fileOut.exists()) {
            try {
                fileOut.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        BufferedReader br = null;
        BufferedWriter bw = null;
        try {
            br = new BufferedReader(new FileReader(fileIn));
            bw = new BufferedWriter(new FileWriter(fileOut));
            String line = null;
            while((line = br.readLine()) != null) {
                if(line.startsWith("USER")) {
                    System.out.println("Writing line: " + line);
                    bw.write(line + "\n");
                }
            }
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
 

E.o.B

Lt. Junior Grade
Dabei seit
Juli 2012
Beiträge
442
Hallo,

sowas habe ich mit TextPad und dessen Makrofunktion schon gemacht.
Dies kann 1:1 das Vorgehen des Nutzers aufzeichnen und anwenden. Also z.B. Suche nach nächstes Vorkommen einer Zeichenkette, mit POS1 an erste stelle der Zeile Springen, Shift halten und ENDE um die Zeile markieren usw.

E.o.B
 

BigNum

Lt. Junior Grade
Dabei seit
März 2012
Beiträge
297
Dafür gibt es Perl.
Du kannst es von hier runterladen, danach installieren.

Das folgende Perl-Script
Code:
#!/usr/bin/perl -w

open(my $in, "in.txt") or die "open failed:$!";
open(my $out, ">out.txt") or die "open failed:$!";

while(<$in>)
{
	if (/USER/)
	{
		print $out $_;
	}
}

close($in);
close($out);
z.B. als "filter.pl" abspeichern (Dateinamen für Ein- und Ausgabedatei "in.txt" bzw. "out.txt" entsprechend anpassen) und in einer DOS-Box mit
Code:
filter.pl
ausführen.


HTH

BigNum
 

Schrumpfi

Lt. Commander
Ersteller dieses Themas
Dabei seit
Jan. 2011
Beiträge
1.315
Vielen, vielen Dank!!
Das Java-Script habe ich leider garnicht testen können, da ich es nicht kompiliert (darf man das so sagen) bekommen habe..... javac wurde nicht gefunden :/
Das Perl-Script hat aber auf Anhieb funktioniert, Dankeschön! (:


Es schreibt mir allerdings nur 120 Zeilen heraus, wenn ich mit Notepad++ nach der Zeile suche werden mir 238 Ergebnisse angezeigt.. Komisch, da für habe ich jetzt auf anhieb keine Erklärung..

Sucht das Perl-Script jetzt auch nur den Anfang der Zeile ab, also wenn schon etwas davor steht funktioniert es nicht!?!?!
 
Zuletzt bearbeitet:

SaxnPaule

Commodore
Dabei seit
Okt. 2010
Beiträge
4.374
Um mit Java zu kompilieren benötigst du JDK. Da reicht kein JRE.

Sag mir deinen Pfad und Dateinamen, dann passe ich den Code an und schicke dir die Datei.

Der Code sucht jetzt nur nach "USER" am Zeilenanfang. Wenn egal ist, an welcher Stelle der Zeile das "USER" stehen darf, muss ich noch eine Zeile anpassen.
 

Schrumpfi

Lt. Commander
Ersteller dieses Themas
Dabei seit
Jan. 2011
Beiträge
1.315
Wow, was für eine Hilfsbereitschaft, das überwältigt mich ja glatt..
Also, wenn du den schon änderst, könnte man da nicht einbauen, dass es am Anfang ein Eingabefenster gibt, wo ich den Pfad dann individuell eingeben kann?? Das wäre sehr praktisch, um nicht immer Dateien umbenennen zu müssen..
Ja, es wäre auch praktisch, wenn nicht nur am Anfang der Zeile gesucht werden würde..
Dann schonmal vielen Dank!!
 

BigNum

Lt. Junior Grade
Dabei seit
März 2012
Beiträge
297
Vielen, vielen Dank!!
Das Java-Script habe ich leider garnicht testen können, da ich es nicht kompiliert (darf man das so sagen) bekommen habe..... javac wurde nicht gefunden :/
Wenn Du Java (das JDK) nicht installiert hast kein Wunder ;)

Das Perl-Script hat aber auf Anhieb funktioniert, Dankeschön! (:
NP

Es schreibt mir allerdings nur 120 Zeilen heraus, wenn ich mit Notepad++ nach der Zeile suche werden mir 238 Ergebnisse angezeigt.. Komisch, da für habe ich jetzt auf anhieb keine Erklärung..

Sucht das Perl-Script jetzt auch nur den Anfang der Zeile ab, also wenn schon etwas davor steht funktioniert es nicht!?!?!
So wie es momentan ist kann "USER" irgendwo in der Zeile stehen, also z.B. auch "xyz abc USER123 987".

Kommt vielleicht "USER" in manchen Deiner Zeilen mehrfach vor?
 

Schrumpfi

Lt. Commander
Ersteller dieses Themas
Dabei seit
Jan. 2011
Beiträge
1.315
Nein, kommt immer nur einmal vor..
Komisch!
Allerdings habe ich gerade entdeckt, dass das mit Notepad++ sehr wohl funktioniert!!
Habe einfach mal bei der Suchfunktion auf "Alle in aktiver Datei suchen" geklickt und dann kam eine wunderschöne Liste mit allen Ergebnissen..
Das Script ist halt praktisch, da man es wiederum in ein anderes integrieren könnte, aber wenn es nur die Hälfte aller Ergebnisse findet ist das nicht so toll.
Obwohl es wirklich ein sehr großer "Zufall" ist, dass das Script genau 120 ausgibt und Notepad++ genau 240.. Aber es steht nicht zweimal in der Zeile.
 

SaxnPaule

Commodore
Dabei seit
Okt. 2010
Beiträge
4.374
Zip Datei auspacken
Console an der Stelle öffnen, wo die Class Datei liegt
Folgendes Command eingeben:
java TextExtractor C:\Temp\fileIn.txt C:\Temp\fileOut.txt USER
Die bunten Stellen jeweils mit Eingangs / Ausgangsdatei und dem gewünschten Begriff ersetzen.

Der Vollständigkeit halber der QuellCode:
Code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class TextExtractor {

    public static void main(String[] args) {
        File fileIn = new File(args[0]);
        File fileOut = new File(args[1]);
        
        if(!fileOut.exists()) {
            try {
                fileOut.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        BufferedReader br = null;
        BufferedWriter bw = null;
        try {
            br = new BufferedReader(new FileReader(fileIn));
            bw = new BufferedWriter(new FileWriter(fileOut));
            String line = null;
            while((line = br.readLine()) != null) {
                if(line.contains(args[2])) {
                    System.out.println("Writing line: " + line);
                    bw.write(line + "\n");
                }
            }
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
 

Anhänge

Zuletzt bearbeitet:

BigNum

Lt. Junior Grade
Dabei seit
März 2012
Beiträge
297
Nein, kommt immer nur einmal vor..
Komisch!
Allerdings habe ich gerade entdeckt, dass das mit Notepad++ sehr wohl funktioniert!!
Habe einfach mal bei der Suchfunktion auf "Alle in aktiver Datei suchen" geklickt und dann kam eine wunderschöne Liste mit allen Ergebnissen..
Das Script ist halt praktisch, da man es wiederum in ein anderes integrieren könnte, aber wenn es nur die Hälfte aller Ergebnisse findet ist das nicht so toll.
Obwohl es wirklich ein sehr großer "Zufall" ist, dass das Script genau 120 ausgibt und Notepad++ genau 240.. Aber es steht nicht zweimal in der Zeile.
Ich hab's mit einer kleineren Datei versucht und es klappt ohne Probleme...

Mir ist gerade noch eingefallen, daß es noch kürzer bzw. sogar in einer Zeile geht:
In der DOS-Box folgendes eingeben:
Code:
perl -n -e "print $_ if (/USER/);" in.txt >out.txt

HTH

BigNum
 

SaxnPaule

Commodore
Dabei seit
Okt. 2010
Beiträge
4.374
<SPAß>Jetzt hast n Virus hehe. </SPAß>

Wie groß sind die Dateien? Wie lang die Zeilen? Was sagt dein Taskmanager derweil.
 

Schrumpfi

Lt. Commander
Ersteller dieses Themas
Dabei seit
Jan. 2011
Beiträge
1.315
Hab mir den Quellcode vorher schon angeguckt, das passt (;
Hab jetzt mal mit einem anderen String gesucht, jetzt piept es nur einmal und funktioniert direkt.. Vielleicht ist das, weil es zu viele Ergebnisse gibt?!
Datei ist 65MB groß und die Zeilen schon relativ lang.
 

SaxnPaule

Commodore
Dabei seit
Okt. 2010
Beiträge
4.374
Ouch, dann müssen da noch ein paar flushs rein. Moment...

Try again please...

Code:
            while((line = br.readLine()) != null) {
                if(line.contains(args[2])) {
                    System.out.println("Writing line: " + line);
                    bw.write(line + "\n");
                    bw.flush();
                }
            }
 

Anhänge

Zuletzt bearbeitet:

Schrumpfi

Lt. Commander
Ersteller dieses Themas
Dabei seit
Jan. 2011
Beiträge
1.315
Es piept zwar immernoch einmal, aber es funktioniert trotzdem..
Vielen Dank auf jeden Fall!! Alleine wäre ich damit wohl einige Tage beschäftigt gewesen..

Okay, habe einfach zum Testen mal nach "a" gesucht und da hat es dann wieder nur gepiept und ist abgestürtzt.. Kommt wohl doch nicht mit so vielen Ergebnissen klar.
 

SaxnPaule

Commodore
Dabei seit
Okt. 2010
Beiträge
4.374
Kannst du mir die Datei evtl. mal gezipped per Mail zukommen lassen?

Ich habe es soeben mit einer 200MB Datei getestet, aus welcher dann 1,1Mio. Zeilen extrahiert wurden (96,3MB).

Die Anwendung hat sich dabei 38MB Ram gegönnt.
 

Anhänge

Zuletzt bearbeitet:

Schrumpfi

Lt. Commander
Ersteller dieses Themas
Dabei seit
Jan. 2011
Beiträge
1.315
Das geht leider nicht, da sind vertrauliche Daten drin..
Ich versuche es dann nocheinmal mit der neuen Version!

Ok, mit der neuen Version geht es schon bedeutend weiter, aber es bricht trotzdem noch ab..
Kann das an Sonderzeichen in der Datei liegen?
 
Zuletzt bearbeitet:
Top