Lesen Sie eine sehr große Single-Line-Txt-Datei und teilen Sie sie auf

Ich habe folgendes Problem: Ich habe eine Datei, die fast 500mb groß ist. Sein Text, alles in einer Zeile. Der Text wird mit einem virtuellen Zeilenende, dessen ROW_DEL aufgerufen wird, getrennt und befindet sich im Text wie folgt:

this is a line ROW_DEL and this is a line 

Jetzt muss ich folgendes machen, ich möchte diese Datei in ihre Zeilen aufteilen, damit ich eine Datei wie folgt bekomme:

 this is a line and this is a line 

Das Problem, auch wenn ich es mit dem Windows-Texteditor öffne, es bricht, weil die Datei zu groß ist.

Ist es möglich, diese Datei zu teilen, wie ich es mit C #, Java oder Python erwähnt habe? Was wäre das beste Soultion, um meine CPU nicht zu übertreiben.

3 Solutions collect form web for “Lesen Sie eine sehr große Single-Line-Txt-Datei und teilen Sie sie auf”

Eigentlich 500mb von Text ist nicht so groß, es ist nur dieser Notizblock saugt. Sie haben wahrscheinlich nicht sed verfügbar, da Sie auf Windows sind, aber zumindest versuchen naive Lösung in Python, ich denke, es wird gut funktionieren:

 import os with open('infile.txt') as f_in, open('outfile.txt', 'w') as f_out: f_out.write(f_in.read().replace('ROW_DEL ', os.linesep)) 

Lesen Sie diese Datei in Chunks, zum Beispiel verwenden StreamReader.ReadBlock in c #. Sie können die maximal zulässige Anzahl von Zeichen festlegen.

Für jedes abgelesene Stück können Sie ROW_DEL auf \r\n ersetzen und es an eine neue Datei anhängen.

Denken Sie daran, den aktuellen Index durch die Anzahl der Charaktere, die Sie gerade gelesen haben, zu erhöhen.

Hier ist meine Lösung.
Einfach im Prinzip (ŁukaszW.pl gab es) aber nicht so einfach zu kodieren, wenn man sich um besondere Fälle kümmern will (was ŁukaszW.pl nicht).

Die eigenthümlichen Fälle sind, wenn der Trenner ROW_DEL in zwei der Leseblöcke aufgeteilt wird (wie I4V darauf hingewiesen hat) und noch subtiler, wenn es zwei zusammenhängende ROW_DEL gibt, von denen die zweite in zwei Leseblöcken aufgeteilt ist.

Da ROW_DEL länger als irgendwelche der möglichen Zeilenumbrüche ist ( '\r' , '\n' , '\r\n' ), kann es in der Datei durch die von der OS verwendete Zeilenumbringung ersetzt werden. Deshalb habe ich die Datei in sich selbst umschreiben wollen.
Dazu verwende ich den Modus 'r+' , es wird keine neue Datei erstellt.
Es ist auch zwingend erforderlich, einen Binärmodus 'b' .

Das Prinzip ist, ein Stück zu lesen (im wirklichen Leben seine Größe wird 262144 zum Beispiel) und x zusätzliche Zeichen, wher x ist die Länge des Separators -1.
Und dann zu prüfen, ob die Trennzeichen am Ende des Chunk + die x Zeichen vorhanden ist.
Accoridng, wenn es vorhanden ist oder nicht, wird das Chunk verkürzt oder nicht, bevor die Transformation des ROW_DEL durchgeführt wird und umgeschrieben wird.

Der nackte Code ist:

 text = ('The hospital roommate of a man infected ROW_DEL' 'with novel coronavirus (NCoV)ROW_DEL' '—a SARS-related virus first identified ROW_DELROW_DEL' 'last year and already linked to 18 deaths—ROW_DEL' 'has contracted the illness himself, ROW_DEL' 'intensifying concerns about the ROW_DEL' "virus's ability to spread ROW_DEL" 'from person to person.') with open('eessaa.txt','w') as f: f.write(text) with open('eessaa.txt','rb') as f: ch = f.read() print ch.replace('ROW_DEL','ROW_DEL\n') print '\nlength of the text : %d chars\n' % len(text) #========================================== from os.path import getsize from os import fsync,linesep def rewrite(whichfile,sep,chunk_length,OSeol=linesep): if chunk_length<len(sep): print 'Length of second argument, %d , is '\ 'the minimum value for the third argument'\ % len(sep) return x = len(sep)-1 x2 = 2*x file_length = getsize(whichfile) with open(whichfile,'rb+') as fR,\ open(whichfile,'rb+') as fW: while True: chunk = fR.read(chunk_length) pch = fR.tell() twelve = chunk[-x:] + fR.read(x) ptw = fR.tell() if sep in twelve: pt = twelve.find(sep) m = ("\n !! %r is " "at position %d in twelve !!" % (sep,pt)) y = chunk[0:-x+pt].replace(sep,OSeol) else: pt = x m = '' y = chunk.replace(sep,OSeol) pos = fW.tell() fW.write(y) fW.flush() fsync(fW.fileno()) if fR.tell()<file_length: fR.seek(-x2+pt,1) else: fW.truncate() break rewrite('eessaa.txt','ROW_DEL',14) with open('eessaa.txt','rb') as f: ch = f.read() print '\n'.join(repr(line)[1:-1] for line in ch.splitlines(1)) print '\nlength of the text : %d chars\n' % len(ch) 

Um der Ausführung zu folgen, hier ist ein weiterer Code, der Nachrichten alleine druckt:

 text = ('The hospital roommate of a man infected ROW_DEL' 'with novel coronavirus (NCoV)ROW_DEL' '—a SARS-related virus first identified ROW_DELROW_DEL' 'last year and already linked to 18 deaths—ROW_DEL' 'has contracted the illness himself, ROW_DEL' 'intensifying concerns about the ROW_DEL' "virus's ability to spread ROW_DEL" 'from person to person.') with open('eessaa.txt','w') as f: f.write(text) with open('eessaa.txt','rb') as f: ch = f.read() print ch.replace('ROW_DEL','ROW_DEL\n') print '\nlength of the text : %d chars\n' % len(text) #========================================== from os.path import getsize from os import fsync,linesep def rewrite(whichfile,sep,chunk_length,OSeol=linesep): if chunk_length<len(sep): print 'Length of second argument, %d , is '\ 'the minimum value for the third argument'\ % len(sep) return x = len(sep)-1 x2 = 2*x file_length = getsize(whichfile) with open(whichfile,'rb+') as fR,\ open(whichfile,'rb+') as fW: while True: chunk = fR.read(chunk_length) pch = fR.tell() twelve = chunk[-x:] + fR.read(x) ptw = fR.tell() if sep in twelve: pt = twelve.find(sep) m = ("\n !! %r is " "at position %d in twelve !!" % (sep,pt)) y = chunk[0:-x+pt].replace(sep,OSeol) else: pt = x m = '' y = chunk.replace(sep,OSeol) print ('chunk == %r %d chars\n' ' -> fR now at position %d\n' 'twelve == %r %d chars %s\n' ' -> fR now at position %d' % (chunk ,len(chunk), pch, twelve,len(twelve),m, ptw) ) pos = fW.tell() fW.write(y) fW.flush() fsync(fW.fileno()) print (' %r %d long\n' ' has been written from position %d\n' ' => fW now at position %d' % (y,len(y),pos,fW.tell())) if fR.tell()<file_length: fR.seek(-x2+pt,1) print ' -> fR moved %d characters back to position %d'\ % (x2-pt,fR.tell()) else: print (" => fR is at position %d == file's size\n" ' File has thoroughly been read' % fR.tell()) fW.truncate() break raw_input('\npress any key to continue') rewrite('eessaa.txt','ROW_DEL',14) with open('eessaa.txt','rb') as f: ch = f.read() print '\n'.join(repr(line)[1:-1] for line in ch.splitlines(1)) print '\nlength of the text : %d chars\n' % len(ch) 

Es gibt einige Subtilität in der Behandlung der Enden der Brocken, um zu erkennen, ob ROW_DEL auf zwei Stücke überspannt und wenn es zwei ROW_DEL zusammenhängend gibt. Deshalb habe ich lange fR.seek(-x2+pt,1) bis ich meine Lösung posten konnte: ich war endlich verpflichtet, fR.seek(-x2+pt,1) zu schreiben und nicht nur fR.seek(-2*x,1) oder fR.seek(-x,1) nachdem, ob sep sich überspannt oder nicht (2 * x ist x2 im Code, mit ROW_DEL x und x2 sind 6 und 12). Jeder, der an diesem Punkt interessiert ist, wird es untersuchen, indem er die Codes in den Abschnitten ändert, if 'ROW_DEL' is in twelve oder nicht.

  • Wie rufe ich Java-Objekte und Funktionen von CPython an?
  • Daten zwischen Java und Python zu übergeben
  • Kann in Java implementiert werden?
  • Stanford-Tagger funktioniert nicht
  • Senden von Daten aus dem Python-Programm in das Java-Programm
  • Fibonacci arbeitet in Python aber scheitert in Java
  • Jython- und Python-Module
  • Python-Dolmetscher in Jython
  • Python-Module von Java aufrufen
  • Integriere Python und seine Bibliotheken mit Java
  • MultiTermVectors in der Elasticsearch Java
  • Python ist die beste Programmiersprache der Welt.