5 Zeilen am Anfang einer TextDatei löschen.

C4rter

Mitglied
Hallo,

wie kann ich die ersten 5 oder auch die ersten 100 Zeilen einer Textdatei löschen? Ich möchte dazu nicht den Rest der Zeilen in eine andere Datei kopieren, da es sich um 25 Millionen Zeilen handelt. Gibt es dazu eine Möglichkeit? Irgendwie sagen mir alle nur, ich soll die restlichen Zeilen in eine neue Datei kopieren, aber bei 25 Millionen is das eher nicht das wahre. Hoffe mir kann einer helfen :)
 
Hallo,

auch wenn es dir nicht gefällt, du wirst dies leider tun müssen. Du kannst das leider nicht mit einem Text-Editor vergleichen, bei dem alles nachrückt, wenn man was löscht. Du wirst ab Zeile 6 (oder wo auch immer du willst) alles neu schreiben müssen.

MFG

zEriX
 
Hallo,

mit einem RandomAccessFile kann man sowas relativ einfach machen:
Java:
/**
 * 
 */
package de.tutorials;

import java.io.RandomAccessFile;

/**
 * @author Thomas.Darimont
 * 
 */
public class DeleteFirstLinesExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        RandomAccessFile randomAccessFile = new RandomAccessFile("lines.txt",
                "rw");

        int numberOfLinesToBeSkipped = 5;

        for (int i = 0; i < numberOfLinesToBeSkipped; i++) {
            System.out.println("Skipping: " + randomAccessFile.readLine());
        }

        long sourcePosition = randomAccessFile.getFilePointer();
        long destinationPosition = 0;

        byte[] buffer = new byte[65535];
        long originalLengthInBytes = randomAccessFile.length();

        moveContent(randomAccessFile, sourcePosition, destinationPosition,
                originalLengthInBytes - sourcePosition,buffer);

        randomAccessFile.setLength(originalLengthInBytes - sourcePosition);

        randomAccessFile.close();
    }

    private static void moveContent(RandomAccessFile randomAccessFile,
            long sourcePosition, long destinationPosition, long lengthInBytes, byte[] buffer)
            throws Exception {
        int currentByteCount = 0;
        int bytesRead = 0;
        int bytesWritten = 0;

        long currentSourcePosition = sourcePosition;
        long currentDestinationPosition = destinationPosition;

        randomAccessFile.seek(currentSourcePosition);
        do {
            randomAccessFile.seek(currentSourcePosition);
            currentByteCount = randomAccessFile.read(buffer);
            bytesRead += currentByteCount;
            if (bytesRead > lengthInBytes) {
                currentByteCount = ((int) lengthInBytes) - bytesWritten;
            }
            bytesWritten += currentByteCount;
            randomAccessFile.seek(currentDestinationPosition);
            randomAccessFile.write(buffer, 0, currentByteCount);
            currentSourcePosition += currentByteCount;
            currentDestinationPosition += currentByteCount;
            randomAccessFile.seek(currentSourcePosition);
        } while (bytesWritten < lengthInBytes);
    }
}

Aus lines.txt:
Code:
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9
line 10
line 11
line 12

Wird dann :
Code:
line 6
line 7
line 8
line 9
line 10
line 11
line 12

Gruß Tom
 
Hallo,

dein Code läuft super, bei der großen Datei dauert es nur ne Sekunde oder so, dann sind die Zeilen weg. Hab jetzt allerdings noch eine weitere Frage :)
Kann man in einer Textdatei in eine bestimmte Zeile etwas zwischenschieben ohne die Datei kopieren zu müssen oder ähnliches. Also, kann ich bei:

1
2
3
5

zwischen der 3 und der 5 eine 4 einschieben?

Vielen Dank

Gruß C4rter
 
Hallo,

da muss ich dich wieder enttäuschen. Da wirst du die Datei auch kopieren müssen. Sobald du was entfernen oder musst du die Datei kopieren.

Ok, wenn du mit RandomAccessFile arbeitest, musst du eigentlich erst ab der Stelle an der du was hinzufügst die Datei neu schreiben.

MFG

zEriX
 
Zurück