Gewisse ASCII-Steuerzeichen aus Textdatei löschen

Gast #1588775
Lesenswert?

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
Angehängte Dateien:
Gast #1588833
Lesenswert?

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.
Gast #1588839
Lesenswert?

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.
Gast #1588846
Lesenswert?

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.
Gast #1588892
Lesenswert?

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
Gast #1588901
Lesenswert?

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) :-))
#1588915
Lesenswert?

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.
Gast #1590169
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren