lyriker
Goto Top

Codepage bei TXT Datei vor Bearbeitung umwandeln - Befehlszeilentool oder

Hallo!

ich habe wieder mal Maschinendaten, die durch den Batch Mixer gejagt werden sollen.

Leider haben diese dafür aber das gänzlich falsche Format, die Dateien sind mit UCS-2 Little Endian codiert.

Kennt jemand eine Methode oder vielleicht auch ein Befehlszeilentool, das mir die Datei davor auf UTF-8 oder ähnlich Batch lesbares umwandelt?

Batch als Beispiel:

Hier zieht er sich die txt-Dateien:
@echo off & setlocal
set "Dateien=*.txt"  
set "Sammel=export/export.csv"  
echo "Maschine;Datum;Zeit;ProOptID;Breite;Höhe;Stückzahl;Status">>"%Sammel%"  
for /f " delims=" %%i in ('dir /b /od "%Dateien%"') do (  
set "battemp=%%i"  
call SendMadaStuerz.bat %battemp%
)

Hier wertet er durch den Aufruf die Datei aus und schriebt Sie in eine Sammeldatei, lässt dabei die ersten 6 Zeilen aus:
@echo off & setlocal
set "Sammel=export/export.csv"  
set "Erste="  
for /f "delims=" %%i in ("%battemp%") do set "Erste=%%i"  
if not defined Erste goto :weiter
for /f "usebackq tokens=1* delims=: " %%i in ("%Erste%") do (  
    for /f "tokens=1,2" %%k in ("%%j") do (  
        set "reihe2=%%k"  
		echo %%k
		set "DateiDatum=%%k"  
		goto :weiter
	)
)
REM copy "%Erste%" "%Sammel%"  
:weiter
for /f "skip=6 usebackq tokens=* delims=|" %%i in ("%battemp%") do (  
	echo|set /p ="Stuerz;%DateiDatum%;">>"%Sammel%"  
	echo %%i >>"%Sammel%"  

)


Ein beispiel der Maschinendaten, die mir leider nur in UCS-2 Little Endian vorliegen:
Datum: 20130411
Maschine: SE-2KPH-CNC, 5736
Herstellung: Stürtz Maschinenbau GmbH
Kunde:

Zeit;ProOptID;Breite;Höhe;Stückzahl;Status
04:12:00;0;0;0;0;Automatik stop
04:12:01;0;0;0;0;Maschine On
04:12:02;0;0;0;0;Not-Aus
04:19:48;0;0;0;0;Automatik start
04:27:08;0;10250;20900;349201;
04:30:37;0;10250;20900;349202;
04:32:14;0;9000;21500;349203;
04:33:58;0;6700;4500;349204;
04:35:24;0;6700;4500;349205;
04:36:36;0;20900;16900;349206;
04:40:50;0;13850;18550;349207;
04:42:15;0;13750;18530;349208;
04:43:22;0;13850;18550;349209;
04:47:02;0;13750;18520;349210;


Anlage:

einige der Dateien:

https://docs.google.com/file/d/0B5CvnhRm_yK_M0xwbXlHLTJfdkE/edit?usp=sha ...

Content-Key: 207789

Url: https://administrator.de/contentid/207789

Printed on: April 19, 2024 at 10:04 o'clock

Member: Endoro
Endoro Jun 10, 2013 at 16:37:46 (UTC)
Goto Top
Hi,

also bei mir klappt das so:

for /f "delims=" %%i in ('type file') do echo %%i  

Gruss!
Member: Lyriker
Lyriker Jun 11, 2013 at 07:31:50 (UTC)
Goto Top
sorry das habe ich nicht ganz verstanden...

was macht das 'type file' ??
Member: Endoro
Endoro Jun 11, 2013 at 08:30:25 (UTC)
Goto Top
Grob zusammengefasst gibt type eine Textdatei auf die Standard-Ausgabe, in diesem Fall die Forschleife, aus.
Also ganz ähnlich wie cat unter Unix.
Member: Lyriker
Lyriker Jun 11, 2013 at 11:43:11 (UTC)
Goto Top
Ich habe mich vielleicht falsch ausgedrückt, oder meine Kenntnisse sind gegenüber Deinem zu gering ;)

Das Script funktioniert Tadellos, sofern ich vorher die TXT-Dateien in UTf-8 umwandle.

Die Text Dateien, die mit mit UCS-2 Little Endian codiert sind, werden nicht ausgelesen und kann so nicht überarbeitet werden.

mit

for /f "delims=" %%i in ('type file') do echo %%i  

habe ich leider nichts erreicht.

Würdest das bitte nochmals für einen Blöden erklären, oder mit einem Beispiel zeigen?

Danke vielmals!
Member: Endoro
Endoro Jun 11, 2013 at 11:57:43 (UTC)
Goto Top
Wenn ich hier so ein UCS-2 Little Endian file habe, bekomme ich das so ausgelesen.

Du kannst deins ja mal irgendwo hochladen, an besten gepackt.
Dann kann ich es mir ansehen.
Member: rubberman
rubberman Jun 11, 2013 updated at 16:26:28 (UTC)
Goto Top
File ist englisch für Datei. Endoro setzt voraus, dass du "file" durch den Name deiner UCS-2 Datei ersetzt oder eben durch eine Variable, die den Name repräsentiert.
for /f "delims=" %%i in ('type "meine_UCS-2_Datei.txt"') do echo %%i
... wenn sie denn so heißen sollte. Ein Blick in die Hilfe zu TYPE hätte dir das aber längst verraten ...

BTW: eine Umwandlung von UCS-2 in UTF-8 ist mit Batch nicht möglich (mit VBScript schon), da entsprechende Codepages keinen vollständigen Support bieten. Wäre auch völlig unsinnig, denn UTF-8 enthält Kodierungen von Zeichen, wie Umlauten, die ohne TYPE wiederum nicht verarbeitbar sind. Hier müsstest du schon eine Codepage wählen, die nur maximal 1 Byte Breite pro Zeichen hat.

Grüße
rubberman
Member: Endoro
Endoro Jun 11, 2013 at 17:01:36 (UTC)
Goto Top
Der Hexdump müsste etwa so aussehen:
0000000: ff fe 44 00 61 00 74 00 75 00 6d 00 3a 00 20 00  ..D.a.t.u.m.:. .
0000010: 32 00 30 00 31 00 33 00 30 00 34 00 31 00 31 00  2.0.1.3.0.4.1.1.
0000020: 0d 00 0a 00 4d 00 61 00 73 00 63 00 68 00 69 00  ....M.a.s.c.h.i.
0000030: 6e 00 65 00 3a 00 20 00 53 00 45 00 2d 00 32 00  n.e.:. .S.E.-.2.
0000040: 4b 00 50 00 48 00 2d 00 43 00 4e 00 43 00 2c 00  K.P.H.-.C.N.C.,.
0000050: 20 00 35 00 37 00 33 00 36 00 0d 00 0a 00 48 00   .5.7.3.6.....H.
0000060: 65 00 72 00 73 00 74 00 65 00 6c 00 6c 00 75 00  e.r.s.t.e.l.l.u.
0000070: 6e 00 67 00 3a 00 20 00 53 00 74 00 fc 00 72 00  n.g.:. .S.t...r.
0000080: 74 00 7a 00 20 00 4d 00 61 00 73 00 63 00 68 00  t.z. .M.a.s.c.h.
0000090: 69 00 6e 00 65 00 6e 00 62 00 61 00 75 00 20 00  i.n.e.n.b.a.u. .
00000a0: 47 00 6d 00 62 00 48 00 0d 00 0a 00 4b 00 75 00  G.m.b.H.....K.u.
00000b0: 6e 00 64 00 65 00 3a 00 0d 00 0a 00 0d 00 0a 00  n.d.e.:.........
00000c0: 5a 00 65 00 69 00 74 00 3b 00 50 00 72 00 6f 00  Z.e.i.t.;.P.r.o.
00000d0: 4f 00 70 00 74 00 49 00 44 00 3b 00 42 00 72 00  O.p.t.I.D.;.B.r.
00000e0: 65 00 69 00 74 00 65 00 3b 00 48 00 f6 00 68 00  e.i.t.e.;.H...h.
00000f0: 65 00 3b 00 53 00 74 00 fc 00 63 00 6b 00 7a 00  e.;.S.t...c.k.z.
0000100: 61 00 68 00 6c 00 3b 00 53 00 74 00 61 00 74 00  a.h.l.;.S.t.a.t.
0000110: 75 00 73 00 0d 00 0a 00 30 00 34 00 3a 00 31 00  u.s.....0.4.:.1.
0000120: 32 00 3a 00 30 00 30 00 3b 00 30 00 3b 00 30 00  2.:.0.0.;.0.;.0.

Das ist problemlos mit type in ASCII umzuwandeln.

Gruss!
Member: rubberman
rubberman Jun 11, 2013 at 17:20:11 (UTC)
Goto Top
So sehe ich das auch face-wink
Member: Lyriker
Lyriker Jun 11, 2013 at 19:17:14 (UTC)
Goto Top
Ich würde gerne die Datei hochladen , müsste aber euch noch bitten, bis morgen zu warten. face-smile

Nach 10 Stunden tüfteln war ich wohl neben mir. Jetzt verstehe ich was das File heissen sollte. Teste das morgen mal aus danke face-smile
Member: Lyriker
Lyriker Jun 12, 2013 updated at 09:14:53 (UTC)
Goto Top
PS: Link zu den Dateien.. mit Type hatte ich leider (noch) keinen Erfolg
https://docs.google.com/file/d/0B5CvnhRm_yK_M0xwbXlHLTJfdkE/edit?usp=sha ...

Und ich habe leider keinen Einfluss auf die Quelle face-sad
Member: Endoro
Endoro Jun 12, 2013 at 12:16:22 (UTC)
Goto Top
Die Dateien haben dieses Format und sind mit type problemlos auzulesen. Ich bin nicht sicher, was du machst. Ich hab eine Kommandozeilensitzung mal auf Pastebin geladen: hier.

Also es ist zu schaffen face-smile

Gruss!
Member: Lyriker
Lyriker Jun 12, 2013 at 12:58:58 (UTC)
Goto Top
hm 4ter Beitrag, sorry

ok habe es nun verstanden, nur mit der vorgebenen Lösung funktionierte das nicht face-smile

ich habe es durch type in eine temporäre Datei lesen lasen, die ich nach dem transfer lösche..

aber danke für den Tip!

PS:

Hier die Lösung falls es jemand interessiert ;) :
@echo off & setlocal
set "Sammel=export/export.csv"  
type %battemp%>>r_%battemp%
set "Erste="  
for /f "delims=" %%i in ("r_%battemp%") do set "Erste=%%i"  
if not defined Erste goto :weiter
echo %Erste%
pause
for /f "usebackq tokens=1* delims=: " %%i in ("%Erste%") do (  
    for /f "tokens=1,2" %%k in ("%%j") do (  
        set "reihe2=%%k"  
		echo %%k
		set "DateiDatum=%%k"  
		goto :weiter
	)
)
REM copy "%Erste%" "%Sammel%"  
:weiter
echo test>>"%Sammel%"  
for /f "skip=6 usebackq tokens=* delims=|" %%i in ("r_%battemp%") do (  
	echo|set /p ="Stuerz;%DateiDatum%;">>"%Sammel%"  
	echo %%i >>"%Sammel%"  

)