mehrer Textdateien Inhalte in eine TXT Datei

Status
Nicht offen für weitere Antworten.

fantrixx

Bekanntes Mitglied
Hi all,

also mein Ziel ist es hundert .txt Dateien mit 20000 Messergebnissen in eine txt Datei zusammen zu fassen.
Das heißt also 100 * 20000 Messergebnisse.
Eine Messergebniss Datei sieht so in etwa aus:

Code:
01.12.2005	12:43:38	20000	20000
9,86938477
9,99755859
10,49530029
10,67474365
10,06805420
9,89929199
9,94201660
9,85870361
9,99755859
10,08941650
.......
.....
...

und immer so weiter....

Also ich habe da auch schon angefangen ABER das lesen einer Datei dauert schon richtig lange so um die 3 - 4 min. für eine Datei und ich weiss Leider noch keinen anderen Ansatz dafür ?

Code:
public class Main {

	private int anzahlDateien = 1;
	private String readPath = "C:\\Dokumente und Einstellungen\\timur\\Desktop\\TC\\TC\\A\\Messung0.txt";
	private String writePath;
	private String name;
	RandomAccessFile f1;
	private String[] gesamtText = new String[100];
	private String loadLine;
	
    public Main() {
    	cutOut();	
    	write();
    }
    
    //schneidet die Texte aus dem einzelnen TXT dateien raus und speichert es in einen String Array
    public void cutOut() {
    	for(int i = 0; i <= anzahlDateien; i++) {
    		System.out.println("Anfang der "+i+" Datei zu lesen");
    		
    		// Hier den Pfad der zu lesenen Dateien angeben
    		readPath = "C:\\Dokumente und Einstellungen\\timur\\Desktop\\TC\\TC\\A\\Messung"+ i +".txt";
    		try {
    			f1 = new RandomAccessFile(readPath, "rw");
    			while((loadLine = f1.readLine())!= null) {
                             gesamtText[i] += loadLine + "\n";
                             
            }
    		} catch(Exception ex) { System.out.println(ex); };
    		System.out.println("Fertig mit der "+i+" Datei LESEN");
    	}
    	//System.out.println(gesamtText[0]);		
    }
    
    //schreibt die einzelnen Texte aus dem String Array in eine Datei
    public void write() {
    	
    	//hier den Pfad der zusammen hängenen schreiben Dateien angeben
    	writePath = "C:\\Dokumente und Einstellungen\\timur\\Desktop\\TC\\a.txt";
    	try{
    		f1 = new RandomAccessFile(writePath, "rw");
    	}catch(Exception ex) { System.out.println(ex); }
    	
    	for(int i = 0; i <= anzahlDateien; i++) {
    		System.out.println("Anfang der "+i+" Datei zu schreiben");
    		try {
    			
    			f1.writeBytes(gesamtText[i]);
    			//f1.close();
    		} catch(Exception ex) { System.out.println(ex); }
    		System.out.println("Fertig mit der"+i+" Datei SCHREIBEN");
    	}
    }
}


Ich hoffe ihr könnt mir eine andere Lösung vorschlagen ?

Danke
 
S

SlaterB

Gast
statt
while((loadLine = f1.readLine())!= null) {
gesamtText += loadLine + "\n";

}
probiere mal
while((loadLine = f1.readLine())!= null) {
}

das geht hoffentlich deutlich schneller, das ist schon eine recht ordentliche lese-Operation,
noch schneller wäre, in einem Schritt ein byte[1000] oder evtl. char[1000] zu lesen falls das geht,
zumindest beim byte[] würdest du dich aber wohl von der Stringverarbeitung entfernen

wenn du beim Zeilen-Lesen bleibts, probiere auch mal BufferedReader
--------

ganz bös ist auf jeden Fall
gesamtText += loadLine + "\n";
da werden ständig neue sehr große Strings erzeugt,

verwende StringBuilder oder in 1.4 StringBuffer
 
S

SlaterB

Gast
falls übersehen: mein Post vor deinem,

und noch ein Hinweis für StringBuider/ Buffer:
am besten gleich die benötigte Initialgröße angeben, 254*1024 oder so?
evtl. eine Datei einlesen und String-Länge anschauen
 

The_S

Top Contributor
Schau mal ob das schneller ist ;) (nicht getestet)

Code:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

public class FastCopy {

	public static void main(String[] args) throws IOException {
		
		if (args.length < 2) {
			System.out.println("Zuerst die Zieldatei, anschliessend alle zu kopierenden Daten eingeben");
		}
		else {
			FileOutputStream fos = new FileOutputStream(new File(args[0]), true);
			FileChannel out = fos.getChannel();
			for (String str : args) {
				File f = new File(str);
				new FileInputStream(f).getChannel().transferTo(0, f.length(), out);
			}
			out.close();
			fos.close();
		}
	}
}
 

fantrixx

Bekanntes Mitglied
SlaterB hat gesagt.:
statt
while((loadLine = f1.readLine())!= null) {
gesamtText += loadLine + "\n";

}
probiere mal
while((loadLine = f1.readLine())!= null) {
}


Moment mal die schleifen sind beide gleich oder was meinst du ?

Zu StringBuilder: Also wie ich es verstanden habe ist der Vorteil hierbei das man die größe des Array Strings vorher angibt und daruch wohl den Rechner einiges an Arbeit weg nimmt oder ?

Also cih werde mir mal gleich den StringBuilder anschauen und verscuhen zu verstehen.
 
S

SlaterB

Gast
> die schleifen sind beide gleich oder was meinst du?
ne, sind nicht gleich,
einmal werden die bösen Strings erzeugt und einmal nicht ;)

StringBuider verwendet intern wohl char[], aber hast weitgehend recht

solch schicken Sachen wie FileChannel (siehe vorheriges Post) kenne ich nicht,
ist vielleicht viel komfortabler
 

The_S

Top Contributor
SlaterB hat gesagt.:
solch schicken Sachen wie FileChannel (siehe vorheriges Post) kenne ich nicht,
ist vielleicht viel komfortabler

Ich hab damit mal testweise 4 Dateien mit insgesamt 603 MB zusammengefügt ... ich muss sagen, das Ergebnis von 52469 Millisekunden beeindruckt mich im Vergleich dazu, dass du, um eine Textdatei mit einigen KB auszulesen, mehrere Minuten benötigst :cool:

Wenn du einen Zeilenumbruch oder sonstige Trennzeichen zwischen den einzelnen Dateien in deinem neuen File haben möchtest, kannst du diese einfach nach jedem

Code:
new FileInputStream(f).getChannel().transferTo(0, f.length(), out);

via

Code:
fos.write(' ');

einfügen.
 

fantrixx

Bekanntes Mitglied
@Hobbit

Also ich steige durch das programm oben FastCopy nicht ganz durch. Kansst du mir das mal erklären was der da macht ?

erstmal die for-schleife

Code:
for (String str : args) {
            File f = new File(str);
            new FileInputStream(f).getChannel().transferTo(0, f.length(), out);
}

was ist den die Bedingung da oben in der Schleife ?

Ich wollte das eigentlich so haben das ich in zwei String erstmal angebe was die Ziel Datei und die zu kopierende Datei ist.
Ich werde es mal versuchen deinen Code bischen umzuändern.
 

fantrixx

Bekanntes Mitglied
So ich habe es an meine Bedürfnisse angepasst und das Programm läuft Super Schnell danke ;)

hier nochmal den veränderte Code:

Code:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

public class FastCopy {
   public String[] readPath = new String[100];
   public String savePath = "C:\\Dokumente und Einstellungen\\timur\\Desktop\\TC\\a.txt";
      
   public FastCopy() {
      copy();
   }
   
   public void copy() {
      for(int i = 0; i <= 5; i++) {
            readPath[i] = "C:\\Dokumente und Einstellungen\\timur\\Desktop\\TC\\TC\\A\\Messung"+i+".txt";
            System.out.println(readPath[i]);
      }
      
      try {
      	System.out.println("Start mit dem Lesen");
      	FileOutputStream fos = new FileOutputStream(new File(savePath), true);
      	FileChannel out = fos.getChannel();
      	for (String str : readPath) {
      		File f = new File(str);
      		new FileInputStream(f).getChannel().transferTo(0, f.length(), out);
     	}
      	out.close();
      	fos.close();
      } catch(Exception ex) { System.out.println(ex); }
   }
   
   public static void main(String[] args) {
   		new FastCopy();
   }
   
   
}
 

The_S

Top Contributor
Gut, besteht immernoch Erklärungsbedarf für das Programm, oder hat sich das jetzt erledigt?
 

fantrixx

Bekanntes Mitglied
Klingt zwar komisch, aber ich habe immer noch nicht die Bedingung in der For-schleifen verstanden also im meinem Falle:

Code:
for (String str : readPath) {
            File f = new File(str);
            new FileInputStream(f).getChannel().transferTo(0, f.length(), out);
}
 

The_S

Top Contributor
Das ist eine For-Each Schleife (gibts ab Java 5). Damit wird jedes Element im Array "readPath" durchgegangen, und für jeden Schleifendurchgang das aktuelle Element in der Variablen "str" gespeichert.
 

fantrixx

Bekanntes Mitglied
Achso okay verstanden, kein wunder das ich das nicht kannte ist ja aus Java 5 mit der Version hänge ich bischen zurück.
 

fantrixx

Bekanntes Mitglied
So ich habe mich nun entschloßen die Struktur der Datei ein bischen zu ändern:

Das jetzige Programm schreibt die Werte aus vielen einzelnen Dateien so in eine Textdatei:

Code:
Messung1
10.000001
10.000002
10.000003
.
.
.
Messung2
10.000001
10.000002
10.000003
.
.
.

Also untereinander

jetz möchte ich gerne das die Messungen neben einander stehen:

Code:
Messung1   Messung2
10.000001  10.000001 
10.000002  10.000002
10.000003  10.000003
.                .
.                .
.                .

Nur weiss ich jetzt nicht wo ich im Code das so verändern sollte ? Sollte ich als trennzeichen Sodnezeichen nehmen oder es bei einem Leerzeichen beibehalten ?

Hier der jetzige Code:

Code:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

public class FastCopy {
   public String[] readPath = new String[100];
   public String savePath = "C:\\Dokumente und Einstellungen\\timur\\Desktop\\TC\\a.txt";
   public int numberData = 99;
      
   public FastCopy() {
      copy();
   }
   
   public void copy() {
      for(int i = 0; i <= numberData; i++) {
            readPath[i] = "C:\\Dokumente und Einstellungen\\timur\\Desktop\\TC\\TC\\A\\Messung"+i+".txt";
            System.out.println(readPath[i]);
      }
      
      try {
      	System.out.println("START mit dem Lesen");
      	FileOutputStream fos = new FileOutputStream(new File(savePath), true);
      	FileChannel out = fos.getChannel();
      	for (String str : readPath) {
      		File f = new File(str);
      		new FileInputStream(f).getChannel().transferTo(0, f.length(), out);
     	}
      	out.close();
      	fos.close();
      } catch(Exception ex) { System.out.println(ex); }
      System.out.println("ENDE mit dem Lesen");
   }
   
   public static void main(String[] args) {
   		new FastCopy();
   }
}
 
S

SlaterB

Gast
> Sollte ich als trennzeichen Sodnezeichen nehmen oder es bei einem Leerzeichen beibehalten ?

inhaltliche Fragen sind ja etwas merkwürdig..,
ein Sonderzeichen ist später besser zu finden als ein Leerzeichen,
wenn du aber nur Inhalte wie '10.000001' ohne eigenes Leerzeichen hast,
dann ist das Leerzeichen ja praktisch ein Sonderzeichen..

musst du selber wissen

------

dass du hier mit FileChannel weiterkommst bezweifle ich, weiß ich aber nicht,
der klassische Weg sieht wiederum das Einlesen der Datei vor,

etwas komfortabler aber langsamer aber dennoch ganz ordentlich:
BufferedReader und Strings, zeilenweises einlesen,
hauptsache StringBuilder um die Strings zusammenzuketten statt +,

könntest natürlich auch immer nur jeweils eine Zeile einlesen und gleich rausschreiben,
dann musst du dir gar nix merken,


etwas schneller noch: Dateiinhalte als char-Array oder byte-Array im großen Stil einlesen (1000+-Array) und dann geschickt zusammenschnipseln,
(nach Zeilenumbrüchen suchen, aus Array A Zeichen 6 bis 29 nach Array B kopieren usw.)

alles was man an Objektorientierung und Übersichtlichkeit verliert,
gewinnt man an Speed
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Klassen Class Files nachladen (mehrer .jar Dateien) Java Basics - Anfänger-Themen 2
R Schulprojekt: Mehrer PC's Hardware Scannen Java Basics - Anfänger-Themen 10
H Mehrer Datentypen aus einer Methode ausgeben. Java Basics - Anfänger-Themen 25
K mehrer applets sollen sich gegenseitig verständigen können Java Basics - Anfänger-Themen 3
P Mehrer Objekte erstellen || Wizard || Java Basics - Anfänger-Themen 24
B mehrer comboboxes mit dem selben inhalt befüllen Java Basics - Anfänger-Themen 8
G Parameterübergabe über mehrer Klassen Java Basics - Anfänger-Themen 2
M mehrer run methoden in einem Thread Java Basics - Anfänger-Themen 7
Z Vector führt mehrer, aber gleiche Elemente Java Basics - Anfänger-Themen 6
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
F Input/Output 2 Textdateien mit einander vergleichen Java Basics - Anfänger-Themen 11
_0815_ Problem mit dem Automatischen eintragen in Textdateien Java Basics - Anfänger-Themen 1
S 4 große Textdateien zu einer Mergen Java Basics - Anfänger-Themen 5
K Textdateien vergleichen optimieren Java Basics - Anfänger-Themen 9
Z Textdateien einlesen und verarbeiten Java Basics - Anfänger-Themen 3
Bluedaishi Textdateien splitten, neu schreiben Java Basics - Anfänger-Themen 13
H Textdateien in Ordner einlesen - unendlich ? Java Basics - Anfänger-Themen 8
T mehrere Benutzer greifen auf Textdateien zu Java Basics - Anfänger-Themen 3
H Vergleichen mit mehreren Textdateien Java Basics - Anfänger-Themen 2
MilchToast Teilstrings aus unbekannt großen Textdateien extrahieren. Java Basics - Anfänger-Themen 5
B Textdateien erweitern Java Basics - Anfänger-Themen 7
A Zugriff auf Textdateien und Datenbanken Java Basics - Anfänger-Themen 3
D textdateien manipulieren, welche klasse? wie? Java Basics - Anfänger-Themen 8
T Textdateien mit Unicode-Zeichen kopieren Java Basics - Anfänger-Themen 2
H in Textdateien etwas schreiben bzw. speichern Java Basics - Anfänger-Themen 2
cowabunga1984 Auslesen von Informationen aus Textdateien Java Basics - Anfänger-Themen 2
J in Textdateien speichern - aus Textdateien auslesen Java Basics - Anfänger-Themen 5
G Textdateien bearbeiten Java Basics - Anfänger-Themen 22
G Bilder und Textdateien aus jar einbinden Java Basics - Anfänger-Themen 7
F Zugriff auf Textdateien über URL Java Basics - Anfänger-Themen 2
E Zwei Textdateien in eine kopieren Java Basics - Anfänger-Themen 5
S Inhalte aus Array vergleichen und Max ausgeben Java Basics - Anfänger-Themen 3
J Inhalte von zwei Arrays vertauschen?! Java Basics - Anfänger-Themen 6
C Array auf Null-Inhalte prüfen Java Basics - Anfänger-Themen 9
M Die Inhalte eines Arrays mit der Methode Arrays.toString ausgeben Java Basics - Anfänger-Themen 4
P Interface Variablen-Inhalte werden nicht übergeben Java Basics - Anfänger-Themen 3
D Erste Schritte JFrame Inhalte werden nicht angezeigt Java Basics - Anfänger-Themen 8
U Tabelle ändern und die Inhalte speichern Java Basics - Anfänger-Themen 9
N Bestimmte Inhalte aus Datei lesen Java Basics - Anfänger-Themen 11
C Inhalte zweier Vektoren vergleichen Java Basics - Anfänger-Themen 3
L Datentypen Array Inhalte vergleichen Java Basics - Anfänger-Themen 6
L Eine ArrayList auf gleiche Inhalte prüfen Java Basics - Anfänger-Themen 10
N Array inhalte verschieben Java Basics - Anfänger-Themen 12
I Im JFrame Inhalte verändern per Methode aus anderer Class Java Basics - Anfänger-Themen 5
MiMa Null Inhalte in Variablen Java Basics - Anfänger-Themen 28
C Dynamische (AJAX) Inhalte einer Webseite mittels Java auslesen Java Basics - Anfänger-Themen 2
C Input/Output Inhalte von ArrayList und JList in Datei schreiben Java Basics - Anfänger-Themen 5
J Regex um Inhalte zwischen Tags zu ignorieren Java Basics - Anfänger-Themen 2
M Aus String bestimmte Inhalte auslesen Java Basics - Anfänger-Themen 8
E Array Inhalte zählen Java Basics - Anfänger-Themen 6
N Alle Inhalte aus Bean in einer anderen Klasse ausgeben Java Basics - Anfänger-Themen 2
D Datentypen String Inhalte ersetzen Java Basics - Anfänger-Themen 8
F Hilfe! JList Inhalte vertauschen Java Basics - Anfänger-Themen 2
M Zwei Objekt Inhalte vergleichen Java Basics - Anfänger-Themen 22
M zwei array inhalte vergleichen Java Basics - Anfänger-Themen 3
G Inhalte eines Arrays mischen Java Basics - Anfänger-Themen 3
R String Arrays Inhalte vergleichen Java Basics - Anfänger-Themen 4
K Inhalte aus einem Java-Applet-Fenster auslesen Java Basics - Anfänger-Themen 2
N aus HTML einzelne Inhalte (z.B. Tabelleninhalte) auslesen Java Basics - Anfänger-Themen 10
G Inhalte in einer Properties Datei setzen? Java Basics - Anfänger-Themen 14
P Inhalte aus Methoden in String Arrays bringen Java Basics - Anfänger-Themen 4
D Inhalte von Stacks miteinander multiplizieren Java Basics - Anfänger-Themen 4
O nicht-statische Inhalte auf statische Inhalte verweisen Java Basics - Anfänger-Themen 19
G .TXT-Datei einlesen, Inhalte durch TABs getrennt Java Basics - Anfänger-Themen 2
T Inhalte zweier Variablen tauschen Java Basics - Anfänger-Themen 18
M Inhalte eines Vectors alphabetisch ordnen Java Basics - Anfänger-Themen 8
G File auslesen u. Inhalte als table in neuem file darstellen Java Basics - Anfänger-Themen 6
N Zugriff auf Vaiablen inhalte der superklasse Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben