Forum: PC-Programmierung Gewisse ASCII-Steuerzeichen aus Textdatei löschen


von KobiP (Gast)


Angehängte Dateien:

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

von dsgbn (Gast)


Lesenswert?

Auf welcher Maschine laeuft das Ausleseprogramm?
Welches OS?

Gast

von KobiP (Gast)


Lesenswert?

Hi!

Die Software muss Windows XP kompatibel sein.

Grüße!

von dsgbn (Gast)


Lesenswert?

Davon habe ich keine Ahnung.

Gast

von Sven P. (Gast)


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.

von Sven P. (Gast)


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.

von Xenu (Gast)


Lesenswert?

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

von Peter (Gast)


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.

von KobiP (Gast)


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

von Toni Holiday (Gast)


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) :-))

von Albrecht H. (alieninside)


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.

von KobiP (Gast)


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

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
Noch kein Account? Hier anmelden.