mikrocontroller.net

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


Autor: KobiP (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: dsgbn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf welcher Maschine laeuft das Ausleseprogramm?
Welches OS?

Gast

Autor: KobiP (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Die Software muss Windows XP kompatibel sein.

Grüße!

Autor: dsgbn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Davon habe ich keine Ahnung.

Gast

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
$ 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternativ:
#include <stdio.h>
#include <stdlib.h>

int main(void) {
  int ch;
  while ( (ch = getchar()) != EOF ) {
    if (ch)
      putchar(ch);
  }

  return EXIT_SUCCESS;
}

Nicht getestet, nur aus dem Kopf heruntergeschrieben.

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: KobiP (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
cat MD066.TXT | tr -d \\0 > ausgabe.TXT
type MD066.TXT | sed 's/\x0//g' > ohne_NUL.txt

bei sed düfte es unter windows so aussehen:
sed MD066.TXT 's/\x0//g' > ohne_NUL.txt
oder?

Grüße

Autor: Toni Holiday (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

du kannst das Ganze auch auf die perlige Art erledigen:
perl -e "while(<>){s/\x00//g;print}" MD066.txt > nMD066.txt

Perl ist sozusagen der Enkel von Opa Sed (bitte keine Schläge) :-))

Autor: Albrecht H. (alieninside)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: KobiP (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.