selektiv Daten aus massiver txt Datei löschen

hoerenraph

Cadet 1st Year
Registriert
Jan. 2017
Beiträge
15
Hallo,
Ich habe folgendes Problem:
Ich habe eine massive Datenbank im txt format (mehrere GB)
In jeder Zeile gibt es 2-3 einträge getrennt durch einen Doppelpunkt.
Ich versuche nun abgrenzend vom Doppelpunkt die Einträge links (und in manchen fällen rechts davon zu löschen.
Aussehen soll das so:

Quelle:
abcdef:12345
kfkdajl:14866
dklasjk:48888931:dafaaa

Ziel:
12345
14866
48888931

Hat jemand eine Idee wie das funktionieren kann?
 
Ich bin sicher irgendwer kann das auch mit abartigem Kauderwelsch mittels sed+awk lösen, aber ich würde das enfach Zeile für Zeile mit ner normalen Skriptsprache, sei es Python, VB oder auch PHP einlesen und dann eben mittels Stringsuchbefehlen etc. die Stellen suchen und löschen, dann die Zeile wieder in eine andere Datei rausschreiben.

100 bis 1000 mal mehr Text in dem Skriptprogramm aber eben verständlich.
 
Gibt es führende 0en?
Wenn nein, ins Excel laden. : als Trennzeichen angeben. Dann kannst du mit Autofilter rausfiltern was raus soll. Das dann als csv speichern. Die kannst du dann wieder in txt umbenennen.
 
Mehrere GB Daten wird mit Microsoft Exel und auch mit LibreOffice Calc die Hölle bis unmöglich.

Es geht sicher mit Bash / Python oder aber "einfach" Microsoft Access / LibreOffice Base, File in eine DB lesen und dort bearbeiten bzw. ein beliebiges anderes DB System. Mir war so, als seien Datenbanksysteme eben für solche Späße da.
 
Danke euch beiden schonmal :)
@Geisterwolf
Leider ist die Datei sowohl für Excel als auch Access zu groß. :(

@HominiLupus
Das hört sich doch super an!
Nur habe ich leider keine Ahnung wie man das anstellt :(
Ergänzung ()

@ Piktogramm
Danke schonmal.
Welche Datenbank ist denn dazu geeignet?
Access hat leider ein Limit im unteren GB Bereich.
Mit anderen habe ich leider noch keine Erfahrungen
 
theoretisch könntest du das mit r statistics probieren.

würde die datei vorher einmal kopieren (sichern).

du kannst dann die datei einlesen, die spalten löschen und dann wieder neu schreiben. ka wie lange das dauert.

zu r statistics gibts jede menge hilfen im netz. anbei kleienr code vllt klappt der ja schon :D

x <- read.csv(file.choose(), sperator =":") # file lokaliseren (hoffe es ist im csv format, txt müsste glaube ich auch gehen)
x <- x[,-c(1,3)] # spalten 1 und 3 löschen
write.csv(x, file = "MyData.csv") # nicht probiert

achja, keine gewähr auf funktionalität :D
 
Zuletzt bearbeitet:
Witzig, Access hat ja wirklich ein recht niedriges Limit..

LibreOffice Base kommt mit HSQLDB, einer Datenbankengine in Java. Limit je Table liegt bei 256GB. LibreOffice Base kann aber auch gegen Postgres und andere DB Engines betrieben werden deren Limits eher als unerreichbar gelten dürften.

Alternativ kannst du dir auch SQLite geben, Das Limitiert dann bei ~140TB, wenn das Dateisystem so große Dateien unterstützt..
 
wenn vor und nach dem ":" keine zahlen enthalten sind:

Code:
grep -Eo '[0-9]+' input.txt > output.txt
 
Hallo Ihr Lieben,

finde es ja amüsant, dass hier jetzt über alle Arten philosophiert wird, wie man das Vorhaben umsetzten könnte aber es nicht umgesetzt wird.
:-)

Falls Python installiert ist, würde ich das mit folgendem Skript lösen:
Code:
txt_file = "pfad/zur/datei.txt"
txt_output = "pfad/zur/ausgabe.txt"

f_in = open(txt_file,"r")
content = f_in.read()
f_in.close()

b = ""

for line in content.splitlines():
   l_s = line.strip()
   if ":" in l_s:
      b += l_s.split(":")[1]+"\n"
   else:
      b += l_s + "\n"

f_out = open(txt_output,"w")
f_out.write(b)
f_out.flush()
f_out.close()

Viel Erfolg!
 
Zuletzt bearbeitet: ([Code] added + lines without :)
@ nik_
gute Idee, leider schafft R das mit diesen Datenmengen auch nicht
R hat etwa 4 GB Arbeitspeicher verwendet bis folgende Meldung kam:

Fehler in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, :
could not allocate memory (2048 Mb) in C function 'R_AllocStringBuffer'

@Pikto
base werde ich dann wohl mal installieren

@0x8100
leider auch Zahlen dabei

@leuteechtjetzt
Das versuche ich dann mal während base runterlädt
Vielen Dank
 
Zuletzt bearbeitet:
@leuteechtjetzt: das funktioniert nicht gut bei dateien im gigabyte bereich, da du alles in den ram lädst

Code:
input_file = 'in.txt'
output_file = 'out.txt'

out_file = open(output_file, 'w+')

with open(input_file) as f:
    for line in f:
        try:
             out_file.write(line.split(':')[1] + '\n')
        except Exception as e:
             print(e)

out_file.close()

ansonsten

Code:
cat in.txt | awk 'BEGIN { FS = ":" } ; { print $2 }' > out.txt
 
Zuletzt bearbeitet:
@horen, stimmt da war was mit R. R lädt alles in den RAM. deswegen die fehlermeldung :D
bleibt noch 0x8100 lösungen
 
@ 0x8100
also alles was ich tun muss ist diese Zeile in eine leere txtdatei zu schreiben, die endung in .py zu ändern und ausführen?
Code:
cat C:\Users\rapha\Desktop\DB\all.txt | awk 'BEGIN { FS = ":" } ; { print $2 }' > C:\Users\rapha\Desktop\DB\all2.txt
 
Zuletzt bearbeitet:
das erste ist ein python script, speichern und mit "python mein_script.py" (nimm für die pfade gleich mal '/' also 'C:/DB/all.txt') ausführen. das zweite habe ich unter linux probiert, das wird so unter windows wohl nicht funktionieren (kein cat/awk, pipes, umleitung in eine datei?)
 
Zuletzt bearbeitet:
SUPER!
es funktioniert mit dem ersten!

jetzt macht es aber leider eine leerzeile zwischen den beiden einträgen
wie bekomme ich das weg?

Vielen Vielen Dank schonmal!
 
dann probiers mal mit

Code:
out_file.write(line.split(':')[1])
statt
Code:
out_file.write(line.split(':')[1] + '\n')

dann wird der explizite zeilenumbruch weggelassen.


edit: das wirds wohl nicht sein, bei mir brauche ich das '\n' unter linux und windows...
 
Zuletzt bearbeitet:
oh zu früh gefreut :(

Nach etwa 4,6 Millionen Zeilen endet das skript, also bei gerade mal rund 46 mb die quelldatei ist 24 gb groß

selbst wenn wir davon ausgehen, dass etwa 2/3 der Daten weggeschniten werden fehlt da der Großteil :(

Das einzige was ich noch lesen kann bevor sich das skript schließt ist "list index out of range"
 
Zuletzt bearbeitet:
Zurück
Oben