Hallo! Ich suche nach einer Möglichkeit das NUL Steuerzeichen aus Textdokumenten zu löschen. Mein Mr. Data erzeugt manchmal fehlerhafte TXTs, (Beitrag "Re: Datenrekorder auf SD-Karte mit mega88") bei der an unterschiedlichen Stellen das NUL-Steuerzeichen auftritt. Und wenn dann gleich 100.000 mal oder mehr, auch ne Million sind keine Seltenheit. Danach können wieder vernünftige Daten kommen. Wie kann ich in akzeptabler Zeit die NUL's löschen? Akzeptabel währe es bei einem auftetenden NUL die nächsten 1000 Zeichen zu überspringen, würde deutlich beschläunigen Ich lese momentan in C++ die Datei mit getline aus, \0 wird als neue Zeile erkannt. Habe eine abfrage gebastelt bei der dann sofort die nächste Zeile ausgelesen wird. Bei der Menge an NUL dauert es aber ewig (habe beim ersten Messfile nach 30min abgebrochen), einfach zu lange um einige duzend Messfiles auslesen zu können. Einfach abbrechen bei NUL möchte ich nicht, da danach noch vernünftige Daten kommen können. Grüße! KobiP
Auf welcher Maschine laeuft das Ausleseprogramm? Welches OS? Gast
Hi! Die Software muss Windows XP kompatibel sein. Grüße!
1 | $ cat MD066.TXT | tr -d \\0 > ausgabe.TXT |
Sind alles stinknormale UNIX-Tools, die müssten sogar in diesem Posix-für-Windows-Ding dabei sein, sonst halt aus Cygwin/Mingw klauen. Bei deiner Beispieldatei lief das in nicht feststellbar kurzer Zeit.
Alternativ:
1 | #include <stdio.h> |
2 | #include <stdlib.h> |
3 | |
4 | int main(void) { |
5 | int ch; |
6 | while ( (ch = getchar()) != EOF ) { |
7 | if (ch) |
8 | putchar(ch); |
9 | }
|
10 | |
11 | return EXIT_SUCCESS; |
12 | }
|
Nicht getestet, nur aus dem Kopf heruntergeschrieben.
Hol Dir sed für Windows hier: http://gnuwin32.sourceforge.net/packages/sed.htm Und dann kannst Du es auf der Kommandozeile folgendermaßen entNULen: type MD066.TXT | sed 's/\x0//g' > ohne_NUL.txt
wenn du schon eine C programm hast, dann lies doch nicht mit getline sondern mit read ein, dann alles was 0 ist wegschmeisen und gut ist. Viel schneller wird es auch mit dem überspringen nicht gehen, weil nicht die CPU sondern das IO die Begrenzung darstellt.
Hi! Werde mir euere Lösungen mal anschauen und testen was am schnellsten ist. Bei den "Linux-Tool-Lösungen" habe ich nur das Problem das man die Befehle so nicht unter Windows eintippen kann:
1 | cat MD066.TXT | tr -d \\0 > ausgabe.TXT |
2 | type MD066.TXT | sed 's/\x0//g' > ohne_NUL.txt |
bei sed düfte es unter windows so aussehen:
1 | sed MD066.TXT 's/\x0//g' > ohne_NUL.txt |
oder? Grüße
Hallo, du kannst das Ganze auch auf die perlige Art erledigen:
1 | perl -e "while(<>){s/\x00//g;print}" MD066.txt > nMD066.txt |
Perl ist sozusagen der Enkel von Opa Sed (bitte keine Schläge) :-))
Die besten Lösungen sind ja schon angeführt worden. Ich hab so was auch schon mal mit OpenOffice erledigt, im Writer kann z.B. man bei "Suchen & Ersetzen" bei den erweiterten Optionen auch "Reguläre Ausdrücke" verwenden, das geht dann auch einigermaßen zügig, wenn man gerade nichts anderes zur Hand hat.
Hi! @Albrecht H.: Suchen und ersetzen ist auch eine Möglichkeit, dauert nur leider ewig und lässt sich nur schwehr automatisieren. @all: Habe mich vorerst für sed entschieden. Selbst 180MB TXTs mit vielen Millionen NULern sind in ner Minute durchgeackert. Die korrekte Befehlszeile lautet
1 | sed s/\\x0//g > out.txt in.txt |
Wenn ich noch Zeit finde werde ich mir die C-Lösungen noch anschauen, sind eleganter, benötigen aber eine gewisse Zeit zum umsetzen die ich jetzt gerade nicht habe. Vielen Dank euch allen! Grüße KobiP
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.