ASCII File auslesen und gewisse Zeichen sichern

Hallo ihr!

Hab folgendes Problem:

Ich möchte aus einer bestehenden txt Datei (ASCII) gewisse
Zeichen (z.B. das 5te, 6te, 80te, etc.) auslesen und dieses
in einem neuen txt File in einem gewissen Format sichern.

Gibts da ein Tool dafür oder ähnliches?

LG & Vielen Dank für eure Zeit
Harry1984

Auch hallo.

Gibts da ein Tool dafür oder ähnliches?

Wenn man mit Perl (oder Java, .NET, C++,…) arbeiten darf: ja

Z.B. mit Perl: http://wiki.perl-community.de/bin/view/Wissensbasis/…
Java: http://www.javacore.de/tutorials.php -> Ein- und Ausgabe mit java.io

HTH
mfg M.L.

Hallo

Ich möchte aus einer bestehenden txt Datei (ASCII) gewisse
Zeichen (z.B. das 5te, 6te, 80te, etc.) auslesen und dieses
in einem neuen txt File in einem gewissen Format sichern.
Gibts da ein Tool dafür oder ähnliches?

Markus hat das Stichwort schon gegeben :wink:,
wenns irgandwas mit text sein soll, geht
oft perl am besten. Das kann man sich
leicht auf dem PC installieren.

Für Dein Problem sähe die (ausbaubare)
Lösung so aus (suchzeichen.pl):

 push @pos, shift for 0 .. $#ARGV; # Positionen einlesen
 chomp and $text .= $\_ while(); # Datei einlesen
 print substr($text, $\_-1, 1), ' ' for @pos; # Zeichen ausgeben

Aufrufen würde man das im Dos-Fenster (oder Unix-shell) mit:

 C:\Temp\> suchzeichen.pl 8 10 20 32 34 zeichen.txt 

wonach die besagten Zeichen aus „meintext.txt“ in der
Datei „zeichen.txt“ stehen würden.

Grüße

CMБ

Und wie funktioniert das mit Perl? Kenn mich darin übrhaupt nicht aus…?

Hallo nochmal.

Und wie funktioniert das mit Perl? Kenn mich darin übrhaupt
nicht aus…?

Das hat der junge Mann doch schon gezeigt :wink:
Unter Windows installiert man ‚ActivePerl‘ und unter Unix/Linux führt man den Programmcode i.A. mit ‚/usr/bin/perl suchzeichen.pl‘ aus. Für Windows i.A. ‚C:\perl\bin\perl suchzeichen.pl‘. Vorausgesetzt, die erforderlichen Dateien existieren in den genannten Pfaden, sollte das Programm dann eine gute Ausgabe liefern. ‚ActivePerl‘ gibt es irgendwo als Installer unter www.activestate.com

HTH
mfg M.L.

Hallo Harry,

Und wie funktioniert das mit Perl? Kenn mich darin übrhaupt
nicht aus…?

Ehe wir Dir hier Perl aufdrücken …

Ich ahne, dass Du etwas anderes machen willst,
als Du beschrieben hast. ich vermute mal, Du willst
aus einer Datei (z.B. meintext.txt):

 ab cd eh gh ij kl mn op qr sw uv wx yz ab cd ef gh ij
 ab cd ea gh ij kl mn op qr si uv wx yz ab cd ef gh ij
 ab cd el gh ij kl mn op qr se uv wx yz ab cd ef gh ij
 ab cd el gh ij kl mn op qr s- uv wx yz ab cd ef gh ij
 ab cd eo gh ij kl mn op qr sg uv wx yz ab cd ef gh ij
 ab cd e- gh ij kl mn op qr se uv wx yz ab cd ef gh ij
 ab cd eh gh ij kl mn op qr sh uv wx yz ab cd ef gh ij
 ab cd ea gh ij kl mn op qr st uv wx yz ab cd ef gh ij
 ab cd er gh ij kl mn op qr ss uv wx yz ab cd ef gh ij
 ab cd er gh ij kl mn op qr s\_ uv wx yz ab cd ef gh ij
 ab cd ey gh ij kl mn op qr ss uv wx yz ab cd ef gh ij
 ab cd e! gh ij kl mn op qr so uv wx yz ab cd ef gh ij

… das z.B. 8. und 29 Zeichen in jeder Zeile haben,
als eine „spaltenweise Extraktion“?

Im obigen Beispiel wäre das:

 h w
 a i
 l e
 l \_
 o g
 \_ e
 h h
 a t
 r s
 r \_
 y s
 ! o

Liege ich richtig?
Was genau hast Du vor?

Grüße

CMБ

Das hab ich vor:

Aus der Messmaschine kommen solche Daten

1 PUNKT Z -504.4743

2 KREIS I X 632.8736
Y -857.4795
D 12.5861
4P S/MIN/MAX 0.0405 (4) -0.0261 (2) 0.0197

3 KREIS I X 633.9996
Y -907.7646
D 21.1681
4P S/MIN/MAX 0.0029 (2) -0.0014 (3) 0.0021

4 PUNKT X 502.8781

5 PUNKT Z -504.4802

Da nicht alle Werte wichtig sind, benötige ich z.B. nur den
Kreisdurchmesser von D 12.5861 (mm)

Diesen Wert möchte ich (gemeinsam mit anderen) in ein txt File
schreiben.

Das ist der Plan… für die Ausführung brauch ich euch :smile:

LG Harry1984

Hallo nochmal.

Diesen Wert möchte ich (gemeinsam mit anderen) in ein txt File
schreiben.

Das ist der Plan… für die Ausführung brauch ich euch :smile:

Aber welche Mittel darf man dafür verwenden ?
Wenn die Datei im csv-Format wäre und in eine Datenbank eingespielt werden könnte, wäre die Sache mit SQL in ein paar Minuten erledigt. Bei Perl z.B. müsste man Sequenzen mit D, dem . und Zahlen von 1 bis 9 auslesen.

mfg M.L.

Was ist mit diesem TCL ? Könnts damit funktionieren?

Hallo

Was ist mit diesem TCL ? Könnts damit funktionieren?

TCL ist zu kompliziert bei Stringverarbeitung (für mich).
In Perl ist alles was Du brauchst, folgendes:
==> exnum.pl

 my ($record, $prefix, $head, $id) = (shift, shift, 0);

 while() {
 $head = 0 unless /\w+/;
 ($id, $head) = split if( /\w+/ and !$head);
 if($head and $head =~ /$record/) {
 my ($key, $value) = split if /^$prefix\s/;
 print "$head $id $key $value\n" if defined $value;
 }
 }

Das kann man, wenn Deine angegebenen Daten in
„daten.txt“ stehen - aufrufen mit:

 C:\daten\> perl exnum.pl KREIS D daten.txt

welches bei Deinem letzten Datensatz
folgende Ausgabe bringt:

 KREIS 2 D 12.5861
 KREIS 3 D 21.1681

(Ausgabe ist anpassbar.)

Perl findest Du hier:

http://downloads.activestate.com/ActivePerl/Windows/…

wenn es installiert wurde, reicht es, das obige
Programm in eine entsprechende Datei zu schreiben
und diese entweder direkt (s.o.) oder per BATCH
aufzurufen.

Grüße

CMБ

Hallo.

Was ist mit diesem TCL ? Könnts damit funktionieren?

Ja:

Aufrufbeispiele :

$ tclsh sps-parser.tcl PUNKT X sps-daten.txt
PUNKT 4 X 502.8781

$ tclsh sps-parser.tcl KREIS D sps-daten.txt
KREIS 2 D 12.5861
KREIS 3 D 21.1681

Code :

if {$argc != 3} {
 puts "Syntax: tclsh sps-parser.tcl gesuchte\_record\_id gesuchter\_parametername dateiname"
 exit
}

proc istLeerzeile { zeile } {
 return [regexp {^\s\*$} $zeile]
}

set gesuchte\_record\_id [lindex $argv 0]
set gesuchter\_parametername [lindex $argv 1]
set dateiname [lindex $argv 2]

set datei [open $dateiname r]
set aktuelle\_record\_id ""

# durchsuche jede Zeile der Datei:
while {[gets $datei zeile] \>= 0} {
 if {[istLeerzeile $zeile]} {
 set aktuelle\_record\_id "" 
 continue
 }

 # untersuche nicht-leere Datenzeile:
 if { $aktuelle\_record\_id eq "" } {
 # neuen Record gefunden:
 set lstFelder [split $zeile " "]
 set datensatznummer [lindex $lstFelder 0]
 set aktuelle\_record\_id [lindex $lstFelder 1]
 }

 # suche im Record nach dem gewünschten Parameter:
 if { ($aktuelle\_record\_id eq $gesuchte\_record\_id) && 
 [regexp "${gesuchter\_parametername}\\s+(\[^\\s\]+)" $zeile gesamttreffer parameterwert] } {
 puts "$aktuelle\_record\_id $datensatznummer $gesuchter\_parametername $parameterwert"
 }
}

TCL ist zu kompliziert bei Stringverarbeitung (für mich).

Es ist nicht ganz so kompakt programmierbar wie Perl,
dafür aber deutlich lesbarer und damit sowohl anfänger-
als auch wartungsfreundlicher, wie ich finde :wink:

Gruß,
-Andreas.

Hallo nochmals!

Ich denke, dass ich mein „Zielscript“ nicht eindeutig formuliert hab:

So sieht das Messdatenfile (Auszug) aus:

http://members.aon.at/heissenberger/MESSUNG.txt

Ich möchte aus diesem spezielle Parameter herausfiltern und
diese dann in einem neuen txt File sichern.

Die Merkmale welche ich angeben möchte, sind von Messung zu
Messung verschieden. Einmal ist der Kreisdurchmesser D wichtig,
einmal die Koordinate Z.

Darum möchte ich die gewünschten werte einfach „händisch“ per
Zeichennummer eingeben… ein etwas mühseliger aber einfacher
Ansatz.

Das Ergenbisfile sollte so aussehen:

merkmal00,12.2343
merkmal01,2.4555
merkmal02,-535.5940
merkmal03,0.0002
usw.

Ich hoffe, dass ich jetzt Klarheit bez. meines Vorhaben
gemacht habe.

MFG & Vielen Dank
Harry1984

Hallo Andreas,

Was ist mit diesem TCL ? Könnts damit funktionieren?

Ja:

TCL ist zu kompliziert bei Stringverarbeitung (für mich).

Es ist nicht ganz so kompakt programmierbar wie Perl,
dafür aber deutlich lesbarer und damit sowohl anfänger-
als auch wartungsfreundlicher, wie ich finde :wink:

Danke für die TCL-Version, hab ich mir gleich mal
abgespeicher - zu Studienzwecken :wink:

Grüße

CMБ

Hallo Harry

Ich denke, dass ich mein „Zielscript“ nicht eindeutig
formuliert hab:
So sieht das Messdatenfile (Auszug) aus:
http://members.aon.at/heissenberger/MESSUNG.txt

So ist das, wenn man nicht gleich die Karten auf
den Tisch legt :wink:

Ich möchte aus diesem spezielle Parameter herausfiltern und
diese dann in einem neuen txt File sichern.
Die Merkmale welche ich angeben möchte, sind von Messung zu
Messung verschieden. Einmal ist der Kreisdurchmesser D
wichtig, einmal die Koordinate Z.

OK, in Perl wäre das:
[parfilter.pl]

 undef $/; # record-Trenner auf \n\n
 my ($record, $key) = (shift, shift); # bestimme "KREIS" bzw. "D"
 my @blk = grep /$record/, split(/\n\n/, ); # lese die N Bloecke ein
 /\s+(\d+).+?$key\s+(\S+)\s/s and printf "$key%02d,$2\n",$1 for @blk;

Aufzurufen mit:

perl parfilter.pl KREIS X messung.txt \> ausgabe.txt

In der Ausgabe stünde dann:

X02,632.8736
X03,633.9996

Darum möchte ich die gewünschten werte einfach „händisch“ per
Zeichennummer eingeben… ein etwas mühseliger aber einfacher
Ansatz. Das Ergebnisfile sollte so aussehen:
merkmal00,12.2343
merkmal01,2.4555
merkmal02,-535.5940
merkmal03,0.0002

Du bist wieder davon abgekommen, konkret darzulegen,
was Du meinst :wink:

Was und wie möchtest Du denn genau an die Messwerdatei
„anfragen“ - und wozu? Und wieviel auf einmal?

Grüße

CMБ

Hui, dann sollte ich konkreter werden :smile:

Also ich hätte mir gedacht, dass ich einfach die Zeichennummer jedner Zahlen eingebe, die mich interessieren.

Also will ich die Z Koordinate -504.4743 haben, dann geb ich die Zeichennummer für „-“ für „5“ für „0“ usw. ein…klar?

Es ist zwar umständlich, dass ich immer die Zeichen zählen kann aber einfacher.

Ists so ok? *g*

LG Harry

Hallo

Also ich hätte mir gedacht, dass ich einfach die Zeichennummer
jedner Zahlen eingebe, die mich interessieren.

Wofür? Was ist eine „Zeichennummer“? Die „Position“ px
in der „Zeile“ py?

Also will ich die Z Koordinate -504.4743 haben, dann geb ich
die Zeichennummer für „-“ für „5“ für „0“ usw. ein…klar?

Wozu? Das kapiere ich nicht.

Es ist zwar umständlich, dass ich immer die Zeichen zählen
kann aber einfacher.

Ich habs echt nicht kapiert :wink:

Wozt soll das gut sein? Du liest eine
Datei in einem Editor etc., schaust Dir
dann die Werte an, siehst den Wert -504
und möchtest dann die „Position“? Kapier ich nicht.

Erklär mir mal bitte, wozu das Ganze
gut sein soll. Vielleicht dämmerts dann
bei mir?

Grüße

CMБ

Hehe… ob das was wird :smiley:

Das Messfile kommt automatisch aus einer Maschine heraus. Das Qualitätssicherungsprogramm kann aber nur Files mit einem gewissen Format importieren - daher möchte ich das Messfile umwandeln.

Die einfachste Art meines erachtens ist, dass ich einfach sage - die Zahl -504.4743 sind die Zeichen 29 bis 37 in Zeile 2. Mein Script soll dumm diese Zeichen in ein neues File sichern mit dem das QS Programm was anfängt.

Dieses Zielfile soll daher genau so aussehen:

merkmal00,-504.4743
merkmal01,12.5674
etc.

Langsam zweifle ich an meinen Sprachkünsten wenns immer noch keiner versteht ;-( *heul*

Danke & LG
Harry

Hallo Harry,

schau dir mal dieses Programm an ich glaube das könnte genau das sein was du brauchst.

http://www.jolodata.com/monarch/monarch_support.htm

dort gibt es auch die möglichkeit den bericht automatisch per batch zu verarbeiten und in so gut wie jedem format zu speichern. (xls, dbf, txt…)

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

im download bereich gibt es auch eine testversion dazu

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo

Das Messfile kommt automatisch aus einer Maschine heraus. Das
Qualitätssicherungsprogramm kann aber nur Files mit einem
gewissen Format importieren - daher möchte ich das Messfile
umwandeln.

OK

Die einfachste Art meines erachtens ist, dass ich einfach sage

  • die Zahl -504.4743 sind die Zeichen 29 bis 37 in Zeile 2.
    Mein Script soll dumm diese Zeichen in ein neues File sichern
    mit dem das QS Programm was anfängt.

IMHO nein(!)

Die „einfachste Art“ ist IMHO zu sagen:
-> gib mir den X-Wert von allen Kreisen, egal wo der steht
und
-> schreibe diesen so raus, wie ich ihn brauche
also (pseudo):

 C:\> GIBMIR X KREIS aus MESSWERT.TXT -schreibenach: AUSGABE.TXT

Wozu die „Positionen“?

Dieses Zielfile soll daher genau so aussehen:

merkmal00,-504.4743
merkmal01,12.5674

Was ist denn ‚merkmal00‘? Schreib doch bitte einmal
den konkreten „Workflow“ (ohne Abstraktionen) für
die konkreten Schritte auf, so dass ich es verstehe.

Grüße

CMБ