lyriker
Goto Top

CSV Datei per Batch bearbeiten, CR, dazu Exponentialformat in Datenzeile und leere Daten zwischen Trennzeichen also ein -for- Problem

Hallo!

wiedermal ich mit meinen Maschinendaten...

zuerst mal die Quelldatei, damit wir wissen um was es geht:

 
* Tag;Monat;Jahr;Uhrzeit;Maschinenummer;Ereigniscode;Fehlercode;Artikelnummer;Belegungsplatz;Losname;laufende Teilenummer im Los;Oeffnungsnummer;Stabnummer;Teilemass1;Teilemass2;Zeit

26;9;2013;6:21:43:926;330030;11;;;;;;;;;;2616;Teil ist jetzt am Einlauf;
26;9;2013;6:21:52:358;330030;1;;757270120001;;;;;;1220.0;730.0;;Eintakten des Teils;
26;9;2013;6:22:26:66;330030;19;;757270120001;;;;;;1220.0;730.0;1800;Austakten des Teils vom Bearbeitungsplatz;
26;9;2013;6:22:48:338;330030;10;;;;;;;;;;;Warte auf Teil am Einlauf der Maschine;
26;9;2013;6:30:25:405;330030;11;;;;;;;;;;455;Teil ist jetzt am Einlauf;
26;9;2013;6:30:32:486;330030;1;;737270030001;;;;;;580.26;987.02;;Eintakten des Teils;
26;9;2013;6:30:53:676;330030;19;;737270030001;;;;;;580.26;987.02;505;Austakten des Teils vom Bearbeitungsplatz;
26;9;2013;6:31:28:366;330030;1;;757270020001;;;;;;580.0;990.0;;Eintakten des Teils;
26;9;2013;6:31:49:526;330030;19;;757270020001;;;;;;580.0;990.0;55;Austakten des Teils vom Bearbeitungsplatz;
26;9;2013;6:32:23:515;330030;1;;757270060001;;;;;;520.0;970.0;;Eintakten des Teils;
26;9;2013;6:32:45:106;330030;19;;757270060001;;;;;;520.0;970.0;55;Austakten des Teils vom Bearbeitungsplatz;
26;9;2013;6:33:18:775;330030;1;;757270070001;;;;;;520.0;970.0;;Eintakten des Teils;
26;9;2013;6:33:40:396;330030;19;;757270070001;;;;;;520.0;970.0;55;Austakten des Teils vom Bearbeitungsplatz;
 
zwischen den einzelnen Zeilen sind dann nur CR also "Carriage return" oder "Wagenrücklauf", vielleicht hilft das ein wenig in der Fehlersuche.

Codierung der Dateien ist ANSI.

Dann will ich die einzelnen Zellen zu Token verarbeiten, (erste drei) das Datum zusammen setzen und die Zeit (Token 4) in ein SQL kompatibles Format bringen.

Mein Versuch:
 
@echo off & setlocal

set "log_temp=D:\Lemuth\abgearbeitet\log_temp.csv"  
set "Sammel=D:\Lemuth\export\export.csv"  
set "log=D:\Lemuth\abgearbeitet\log.csv"  

for /f "skip=1 usebackq tokens=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18* delims=;" %%A in (quelle.csv) do (  
	echo|set /p ="%date% ">>"%log_temp%"  
	echo|set /p ="%time%~Lemuth~%%A-%%B-%%C~%%D">>"%log_temp%"  
	echo|set /p ="~%%E~%%F~%%G~%%H~%%I">>"%log_temp%"  
	echo ~%%J~%%K~%%L~%%M~%%N~%%O~%%P>>"%log_temp%"  
	
)
 

Leider kommt dann Mist raus, und ich verstehe nicht warum:

 
23.10.2013 17:50:48,57~Lemuth~26-9-2013~6:21:43:926~330030~11~2616~Teil ist jetzt am Einlauf~26~9~2013~6:21:52:358~330030~1~757270120001~1220.0
 
Ich danke für jede erdenkliche Hilfe, wahrscheinlich bin ich wieder betriebsblind.

Content-ID: 220226

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

Ausgedruckt am: 25.11.2024 um 07:11 Uhr

Endoro
Endoro 23.10.2013 um 18:52:04 Uhr
Goto Top
Hi,
was ist denn die erwartete Ausgabe?
lg.
Lyriker
Lyriker 24.10.2013 aktualisiert um 08:58:18 Uhr
Goto Top
26-09-2013~6:21:43~330030~11~~~~~~~~~~2616~Teil ist jetzt am Einlauf~ 
26-09-2013~6:21:52~330030~1~~757270120001~~~~~~1220.0~730.0~~Eintakten des Teils~ 
06.
26-09-2013~6:22:26~330030~19~~757270120001~~~~~~1220.0~730.0~1800~Austakten des Teils vom Bearbeitungsplatz~ 
07.
26-09-2013~6:22:48~330030~10~~~~~~~~~~~Warte auf Teil am Einlauf der Maschine~ 
.....

Das sollte eigentlich raus kommen. Hier nochmal eine Quelldatei: GDriveDokument

Wie ich das Datum unwandle und die Zeit, ist für mich an sich kein Problem, was das Problem ist, das er die "leeren" Felder einfach überspringt?!
Vielleicht liegt das an der Tatsache, das die CSV nur einen Wagenrücklauf (CR) am ende der Zeile bietet und somit kein Zeilenvorschub (LF) hat um der Windows Nomierung CR/LF zu entsprechen?


Das nächste Problem ist die Artikelnummer, die in der CSV als Exponential nach Batchdurchlauf dargestellt wird.

Beste Grüße zurück und Danke für die Hilfe!
Endoro
Endoro 24.10.2013 um 09:09:53 Uhr
Goto Top
Hi,
die leeren Zellen werden übersprungen, weil dort Delimiter nebeneinander liegen.
Die Forschleife macht da aus allen einen draus.
lg.
Lyriker
Lyriker 25.10.2013 um 15:32:46 Uhr
Goto Top
Ist sowas eventuell mit vb die man im batch aufruft realisierbar? Ich steh echt auf dem schlauch.. ;(
Endoro
Endoro 25.10.2013 aktualisiert um 19:18:18 Uhr
Goto Top
Zu VB kann ich nichts sagen. Du kannst aber den Teil der Zeichenkette, der Datum und Zeit enthaelt wie bisher und den Rest mit Stringmanipulation bearbeiten.
lg.

PS also etwa so:
@ECHO OFF &SETLOCAL
set "CSVFile=136032_1_2592013.csv"  
for /f "delims=" %%a in ('type "%CSVFile%"^|tr \r \n') do (  
	for /f "tokens=1-4*delims=;" %%b in ("%%~a") do (  
		set "cDate=%%d-%%c-%%b"  
		set "cTime=%%e"  
		set "line=%%f"  
		SETLOCAL ENABLEDELAYEDEXPANSION
		set "cTime=!cTime:~0,8!"  
		set "line=!line:;=~!"  
		echo(!cDate!~!cTime!~!line!
		endlocal
	)
)
Damit dieser x13h Zeilenumbruch gelesen werden kann, hab ich das UNIX-Programm tr eingesetzt (CoreUtils for Windows).
lg.
Lyriker
Lyriker 28.10.2013 um 15:10:51 Uhr
Goto Top
Hi,

nach bisschen mehr Hirnschmalzeinsatz meiner Seite und Forum forsten habe ich es mit einer VB Routine gelöst.

Das schöne an der Routine ist, er löst die falschen Umbrüche, ackert das File erst mal zu einem ordentlichen Format wandelt mir die Zahlen auch sauber um und gibt es sauber aus:
Datei = "D:\Lemuth\vbs\136032_1_2592013.csv"  
Delim = ";" 'Feldtrennzeichen  
Dateineu = "D:\Lemuth\vbs\136032_1_2592013_test.csv"  
Dateitemp = "D:\Lemuth\vbs\136032_1_2592013_tmp.csv"  

Set fso = CreateObject("Scripting.FileSystemObject")  
' Lese Quelle ein  
sText = fso.OpenTextFile(Datei).ReadAll
' ersetze alle CrLf durch Cr  
sText = Replace(sText, vbCrLf, vbCr)
' Ersetze alle Cr durch vbCrLf  
sText = Replace(sText, vbCr, vbCrLf)
' schreibe Daten in temporäre Datei  
fso.CreateTextFile(Dateitemp).Write sText
'Gesamten Dateiinhalt einlesen und zeilenweise aufgeteilt im Array T() ablegen  
T = Split(fso.OpenTextFile(Dateitemp).ReadAll, vbCrLF)
Neu = "" 'Variable für berarbeiteten Dateiinhalt vorbereiten  
'Zähle die Zeilen  
zeilenzaehler = 0 
'In einer Schleife alle Zeilen durchgehen  
For Each Z In T
	'Überspringe die ersten zwei Zeilen  
	if zeilenzaehler > 1 then 
		'Zeile anhand des Trennzeichens aufteilen und im Array S() ablegen  
		S = Split(Z, Delim)
		'Variable für Ausgabezeile löschen ...  
		Aus = ""  
		'Wenn zeile leer dann überspringen  
		If Z = "" Then   
			Else
			'gehe alle durch ; getrennten Felder  
			For i = 0 To 16
				'msgbox(S(i))  
				Austmp = ""  
				' wenn Zaehler = 0 dann schreibe Tag  
				If i = 0 then
					Austemp = S(i) & "-"  
				end if
				' wenn Zaehler = 1 dann schreibe Monat-  
				If i = 1 then
					Austemp = Austemp & S(i)& "-"  
				end if
				' wenn Zaehler = 2 dann schreibe Jahr- und in Aus(gabe)  
				If i = 2 then
					Austemp = Austemp & S(i)
					Aus = Austemp
				end if
				' wenn Zaehler größer 3 dann schreibe normal weiter  
				If i > 2 then
					'MSGbox([i])  
					Aus = Aus & Delim & S(i)
				end if
				'komische Zahl in echte Zahl wandeln  
				If i = 14 then
					'msgbox(S(i))  
				end if
				'schreibe noch ein Feldtrenner dahinter  
				If i = 16 then
					Aus = Aus & Delim
				end if
			Next
		end if
		'Fertige Ausgabezeile dem neuen Dateiinhalt nach einer Zeilenschaltung hinzufügen  
		Neu = Neu & vbCrLf & Aus
	end if
'zähle die Zeilen und nun eine Zeile weiter  
zeilenzaehler = zeilenzaehler+1
Next
'Neuen Dateiinhalt in alte Datei schreiben (diese dazu neu erstellen)  
fso.CreateTextFile(Dateineu).Write Neu
Ergebnis:

25-9-2013;10:24:16:679;136032;13;;;;;;;;;;13;Auslauf der Maschine ist jetzt frei;
25-9-2013;10:24:18:967;136032;19;;757150250102;;;;;;581000;0.0;72;Austakten des Teils vom Bearbeitungsplatz;
25-9-2013;10:24:27:348;136032;11;;;;;;;;;;13;Teil ist jetzt am Einlauf;
25-9-2013;10:25:14:58;136032;1;;756800220102;;;;;;706000;0.0;;Eintakten des Teils;
25-9-2013;10:25:15:157;136032;12;;;;;;;;;;;Warte das Auslauf der Machine frei;
25-9-2013;10:34:48:49;136032;13;;;;;;;;;;572;Auslauf der Maschine ist jetzt frei;
25-9-2013;10:34:49:378;136032;19;;757150210302;;;;;;656000;0.0;629;Austakten des Teils vom Bearbeitungsplatz;
25-9-2013;10:34:55:681;136032;1;;756800180200;;;;;;596000;0.0;;Eintakten des Teils;
25-9-2013;10:35:42:521;136032;19;;756800230102;;;;;;681000;0.0;53;Austakten des Teils vom Bearbeitungsplatz;
25-9-2013;10:35:48:515;136032;1;;756800200102;;;;;;916000;0.0;;Eintakten des Teils;
25-9-2013;10:36:38:702;136032;12;;;;;;;;;;;Warte das Auslauf der Machine frei;
25-9-2013;10:37:16:442;136032;13;;;;;;;;;;37;Auslauf der Maschine ist jetzt frei;
25-9-2013;10:37:17:640;136032;19;;756800220102;;;;;;706000;0.0;95;Austakten des Teils vom Bearbeitungsplatz;
25-9-2013;10:37:23:894;136032;1;;756800260102;;;;;;701000;0.0;;Eintakten des Teils;
25-9-2013;10:38:13:831;136032;12;;;;;;;;;;;Warte das Auslauf der Machine frei;

ein paar Sachen gefallen mir noch nicht, aber die kann ich ja noch ändern (das 0.0 zum Beispiel)