ich bin am verzweifeln. Ich will in vielen Textfiles (ca. 70 stück) schauen ob gleiche Wörter drin stehen und falls ja den Dateinamen und Zeilennummer davon ausgeben. Ich hab jetzt schon was von regex gelesen aber ich find irgendwie keinen Ansatz.
Ich will ja nicht das jemand hier mir ein Programm schreibt! Echt nicht!
Also ich weiß nicht ob ich damit beginnen sollte alle Textfiles zu öffnen aber dann?!? Ich muss ja irgendwie alle Wörter aus allen Textfiles speichern, also alle einlesen und irgendwo Speichern, dann muss ich die irgendwie mit den Textfiles vergleichen...und dann noch irgendwie ausgeben wo ich den doppelten eintrag finde...ahhhh ich dreh noch durch.
ansonsten ruhig Blut und anfangen, z.B. eben erstmal nur zwei Dateien vergleichen,
falls alle Dateien zusammen unter 100 MB groß sind, kannst du (mit erhöhten Speicher fürs Programm) alle einlesen und recht sorgenfrei Vergleichsstrukturen aufbauen,
ansonsten wirds komplizierter im Selberbau
Also gut ich hab jetzt mal angefangen und bin mal soweit das er eine Datei einliest und die wichtigen Zeilen herausfiltert. Aus irgendeinem Grund schreibt er die sachen nicht in das Outputfile. Er erstellt Sie aber sie ist leer... wobei der command output stimmt...komisch, jemand eine idee?
Jetzt will ich diese Zeile noch weiter filtern mittels regex. Ich weiß aber nicht wie, kennt sich jemand damit aus? Außerdem wie kann ich mehrere Files nacheinander durchlaufen lassen? Anstatt eine txt, alle dateien in einem unterordner? Welche Befehle brauch ich dafür?
Hier mein Code bis jetzt:
Code:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import java.io.File;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
//import java.util.regex.*;
/**
*
* @author pabu
*/
public class Sym_vergleich {
public static void main (String[] args) {
String begin_var = " VARIABLES";
String end_var = "/*-----";
boolean var = false;
String begin_sym1 = "const";
String begin_sym2 = "static";
String begin_sym3 = "SWORD";
String begin_sym4 = "UWORD";
String begin_sym5 = "Bool";
String begin_sym6 = "UBYTE";
// Pattern p = Pattern.compile("[\w]\p{L}\s[\w]\s[\w]");
// Matcher m = p.matcher("aaaaab");
try {
FileReader fr = new FileReader("out.txt");
BufferedReader myReader = new BufferedReader(fr);
String line = myReader.readLine();
File ausgabeDatei = new File("out_var_only.txt");
FileWriter fw = new FileWriter(ausgabeDatei);
BufferedWriter bw = new BufferedWriter(fw);
while (line != null) {
line = myReader.readLine();
if (line.equals(begin_var)) {
var = true;
}
if (line.startsWith(end_var)) {
var = false;
}
if (var == true) {
if (line.startsWith(begin_sym1) || line.startsWith(begin_sym2) || line.startsWith(begin_sym3) ||
line.startsWith(begin_sym4) || line.startsWith(begin_sym5) || line.startsWith(begin_sym6)) {
System.out.println(line);
bw.write(line);
bw.newLine();
}
}
}
myReader.close();
bw.flush();
bw.close();
}
catch (Exception e) {
}
}
}
ok das mit mehreren Files hab ich, jetzt brauch ich nur noch hilfe mit dem regex...
Ich will folgendes erreichen:
Wenn die Zeile mit var1 ODER var2 beginnt, dann speichere nur das Dritte Wort in dieser Zeile
Wenn die Zeile mit var3 ODER var4 beginnt, dann speichere nur das Zweite Wort in dieser Zeile
das problem ist wenn ich das mit if mache brauche ich trotzdem einen befehl der mir dann das dritte oder zweite wort speichert. wie mache ich das dann? Dachte das geht irgendwie mit pattern und matcher...
Mein Idee wäre: Die Wörter einer Datei in einem [c]HashSet[/c] speichern, für jede Datei ein eigenes Set anlegen.
Nach dem durchlauf die HashSets vergleichen und wenn ein Wort in einem anderen HashSet schonmal vorkommt, dieses Wort in einem letzten HashSet speichern.
Da man auf diese weise wahrscheinl. alle Sets nacheinander miteinander vergleich muss, wäre es denk ich nicht verkehrt die bereits gecheckten wörter aus den HashSets beim durchlauf zu löschen
Wenn die Zeile mit var1 ODER var2 beginnt, dann speichere nur das Dritte Wort in dieser Zeile
Wenn die Zeile mit var3 ODER var4 beginnt, dann speichere nur das Zweite Wort in dieser Zeile
Zeilenweise einlesen, in einem String speichern, [c].trim();[/c] benutzen. Dann würde ich eine HashMap anlegen etwa so: [c]HashMap<String, Integer> wortwahl[/c]. Dann zerlegst du den String mittels [c].split(" ");[/c] in seine Wörter und machst einen check:
mit Hashsets kenn ich mich gar nicht aus, könntest du n bissl größeres Beispiel hier reinschreiben?
Wenn nicht hab ich das Problem jetzt auch anders gelöst (zumindest mit dem passenden Wort rausfiltern). Jetzt muss ich nur noch diese Wörter vergleichen und die doppelten in einer Datei ausgeben. Ich wollte (weil ich das mit dem vergleichen nicht hinbekomme) erstmal alle gefilterten Worte in eine TXT ausgeben, aber irgendwie bekomme ich keine Daten rein... Er erstellt die "_all.txt" aber mit 0KB und ist leer.
Hier mein bisheriger Code:
Code:
import java.io.File;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.StringTokenizer;
public class Sym_vergleich {
public static void main (String[] args) {
File dir = new File("D:/Temp/");
File[] fileList = dir.listFiles();
String begin_var = " VARIABLES";
String end_var = "/*-----";
boolean var = false;
String begin_sym1 = "const";
String begin_sym2 = "static";
String begin_sym3 = "SWORD";
String begin_sym4 = "UWORD";
String begin_sym5 = "Bool";
String begin_sym6 = "UBYTE";
for(File f : fileList) {
try {
FileReader fr = new FileReader(f);
BufferedReader myReader = new BufferedReader(fr);
String line = myReader.readLine();
File ausgabeDatei = new File("D:/Temp/_all.txt");
FileWriter fw = new FileWriter(ausgabeDatei);
BufferedWriter bw = new BufferedWriter(fw);
while (line != null) {
line = myReader.readLine();
if (line.equals(begin_var)) {
var = true;
}
if (line.startsWith(end_var)) {
var = false;
}
if (var == true) {
if (line.startsWith(begin_sym1) || line.startsWith(begin_sym2)) {
StringTokenizer st = new StringTokenizer(line);
String word = (String)st.nextToken();
word = (String)st.nextToken();
word = (String)st.nextToken();
System.out.println(word);
bw.write(line);
bw.newLine();
}
if (line.startsWith(begin_sym3) || line.startsWith(begin_sym4) ||
line.startsWith(begin_sym5) || line.startsWith(begin_sym6)) {
StringTokenizer st = new StringTokenizer(line);
String word = (String)st.nextToken();
word = (String)st.nextToken();
System.out.println("Variable " + word + " in der Datei " + f);
bw.write(line);
bw.newLine();
}
}
}
myReader.close();
bw.flush();
bw.close();
}
catch (Exception e) {
}
}
}
}
Musst halt beachten: sind casesensitiv, also vllt immer die [c]toLowerCase()[/c] oder halt die [c]toUpperCase()[/c] verwenden. Im Prinzip achtet das Set einfach nur darauf, dass keine Einträge doppelt vorkommen.
Die Einträge bekommst du z.B. durch iteriern wieder:
Java:
Iterator<String> it = word.iterator();while(it.hasNext()){System.out.println( it.next());}// Ausgabe:// Hallo// hallo