coldzero89
Goto Top

Per Batch und VBS spezielle Datensätze aus CSV ziehen und in neue Datei

Moin Moin,

vorab: Das Gerüst für das Script in meinem Kopf steht, ich will vorab nur das Problem gelöst haben um alles in einem Durchschreiben zu können.

Folgendes Problem steht vor mir:

Wir haben Datein die mehrere Tausend Datensätze enthalten in Excel (csv) Tabellen.
Zeilen: 10082
Spalten: bis CO (die größte Datei)

Dies sind Minutenwerte einer ganzen Woche die eine unserer Solaranlagen logt.
Mein Chef möchte nun für diese Datein ein Script haben, das ihm eine gewählte Datei öffnet (Mein Gedanke war die Datei in einen Ordner zu dem VBS oder Batch zu legen) ihm die Spalte mit dem eingegebenem Datum (Bsp. 30.09.2012) + die Uhrzeit 23:50 in die gewählte Zeile springt und die Daten folgender Spalten (T, AO, BJ und CE) aus der Datei saugt und diese in eine neue Datei schreibt, dabei soll dann halt die Spalte mit dem Datum, + die 4 Werte aus den Spalten FORTLAUFEND in die neue Datei geschrieben werden, sodass diese Dokumentiert sind.

Es handelt sich insgesamt um 2 Verschiedene Datein, die eine hat die Spalten T, AO, BJ und CE. Die andere nur T und AO.

Mein Gedanke war nun ihn einfach dennoch BJ und CE mit zu kopieren, sind dann halt leer.
Ich würde eine Abfrage in das Script bauen (Daher die Kombie Batch und VBS - mit batch weiß ich das komplette außengerüst zu bauen) welches Fragt ob die Datei von PVU1 ist oder von PVU2, somit schreibt er die Werte in 2 verschiedene Datein für PVU1 und PVU2.

Mein Wissen endet bei dem Punkt per VBS die Excel Datei zu öffnen, die gewählten Daten die vorher eingegeben wurden (Datum) suchen zu lassen und aus den gewählten Spalten das zu kopieren und in die neue Datei einzufügen.

Per Marko hab ich grobe snipptest was das Suchen in einer Spalte angeht, das springen in die freie Zeile und dann das gewählte einfügen. Nur wie das als VBS aussieht hab ich keine Ahnung, daher erhoffe ich mir eure Hilfe.
Wie ich Variablen von Batch an VBS übergebe weiß ich auch.
Das folgende Script ist dazu da um eine Datei zu öffnen, vorgegebene Anlagen zu finden und diese dann in eine andere Datei zu kopieren.
Sub Daten_holen()
Application.ScreenUpdating = False 'Screen off  
'Marko um in der Tagesauslesung nach Parknamen zu suchen um diese zu Kopieren und in die Tabelle einzutragen  
Dim Parknummer As Integer
Dim Parkname As String
Dim Suchbereich As Integer
Dim WRAnzahl As Byte
'Excel Datei öffnen  
    Workbooks.Open Filename:= _
        "PFAD\_tagesauslesung_zählerstände.xls" _  
    'Deklarierung der Entsprechenden Daten  
    For Parknummer = 1 To 3 'Erste Schleife  
     If Parknummer = 1 Then
        Parkname = "Bad Kreuznach"  
        WRAnzahl = 9
     End If
     If Parknummer = 2 Then
        Parkname = "Göttelborn"  
        WRAnzahl = 16
     End If
     If Parknummer = 3 Then
        Parkname = "Landau"  
        WRAnzahl = 7
     End If    
        'Suchlauf nach Parknamen. Kopieren und Einfügen der Daten  
        Workbooks("_tagesauslesung_zählerstände").Activate  
        For Suchbereich = 1 To 300 'Zweite Schleife  
         If Cells(Suchbereich, 1) = Parkname Then
            Cells(Suchbereich, 1).Select
            Selection.Offset(1, 1).Select
            Range(Cells(ActiveCell.Row, 2), Cells((ActiveCell.Row + (WRAnzahl - 1)), 2)).Select
            Selection.Copy        
            Workbooks("Anlagenabfrage für FlexCtrl + CCC").Activate  
            Sheets("Makro").Select  
            For Copybereich = 1 To 300 'Dritte Schleife  
             If Cells(Copybereich, 1) = Parkname Then
                Cells(Copybereich, 1).Select
                Selection.Offset(1, 1).Select
                Range(Cells(ActiveCell.Row, 2), Cells((ActiveCell.Row + (WRAnzahl - 1)), 2)).Select
                Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                    :=False, Transpose:=False
            Exit For 'Dritte Schleife  
             End If
            Next 'Dritte Schleife  
            
        Exit For 'Zweite Schleife  
         End If
        Next 'Zweite Schleife          
    Next 'Erste Schleife  
    'Excel Datei schließen  
    Workbooks("_tagesauslesung_zählerstände").Close  
    Application.ScreenUpdating = True 'Screen on  
End Sub
Das funktioniert soweit einwandfrei das Marko.

Wie bringe ich genau dies auf dem Weg in ein VBS? Sodass ich dieses ins Batch bauen kann, die eingegebenen Variablen übergeben kann – vorher halt prüfen lassen welches PVU es ist. Ob 1 oder 2 und den Pfad dann mitgeben und nach welchem Datum gesucht werden soll.

Daher meine Frage an euch: WIE bekomm ich makro wie es da ist – denn ich denke mit ein paar Abänderungen der Variablen und alles kann ich damit nach der zeile suchen lassen und diese dann kopieren.
Wie geb ich ihm dann auch den befehl mit „Kopiere Spalte T“ „Kopiere Spalte AO“ usw.? Weiß nicht ob es möglich ist dem VBS zu sagen „Kopiere Spalte X Z A und G und packe die, sodass sie nebeneinander dann in Spalte B, C, D und E sind in die neue Datei“

Hoffe ich konnt mich deutlich ausdrücken, sollten noch fragen offen sein, fragt.

Danke und Gruß
ColdZero89

Content-ID: 192636

Url: https://administrator.de/forum/per-batch-und-vbs-spezielle-datensaetze-aus-csv-ziehen-und-in-neue-datei-192636.html

Ausgedruckt am: 22.12.2024 um 15:12 Uhr

bastla
bastla 11.10.2012 aktualisiert um 17:36:45 Uhr
Goto Top
Hallo ColdZero89!

Grundsätzlich kannst Du Excel per VBS "fernsteuern", indem Du ein "Excel.Application"-Objekt dafür verwendest (wie zB in diesem Thread) ...

Beachten musst Du dabei ua, dass "xl"-Konstanten in VBS natürlich nicht bekannt sind und Du sie daher entweder durch ihren Wert (etwa -4163 für "xlPasteValues") ersetzen musst, oder, besser, sie im VBS neu deklarierst:
Const xlPasteValues = -4163
Die Schreibweise mit benannten Argumenten (zB "Paste:=xlPasteValues") wirst Du durch einfache Übergabe der einzelnen Argumente in der richtigen Reihenfolge (durch Kommata getrennt) ersetzen müssen.

Deklarationen per "Dim" kannst du zwar vornehmen (sinnvoll, wenn Du auch "Option Explicit" verwendest), musst aber das Festlegen von Datentypen ("As Integer") dabei weglassen (in VBS sind alle Variablen "Variant").

Der mit dem Makro-Recorder aufgezeichnete Code arbeitet (erklärlicher Weise) mit vielen "Selection"-Objekten und lässt sich daher zumeist noch reduzieren - zB kannst Du aus
Cells(Suchbereich, 1).Select
Selection.Offset(1, 1).Select
Cells(Suchbereich, 1).Offset(1, 1).Select
machen oder das auch gleich umarbeiten in
Range(Cells(Suchbereich + 1, 2), Cells((Suchbereich + 1 + (WRAnzahl - 1)), 2)).Copy
Einfacher wäre es übrigens mE, nur die Werte abzuholen und in eine CSV-Datei zu schreiben - die kann dann ja auch direkt mit Excel geöffnet werden ...

Grüße
bastla

P.S.: Für die Zeilen 13 bis 24 hätten mir ein "Select Case" oder 2 vorweg befüllte Arrays besser gefallen ... face-wink
ColdZero89
ColdZero89 12.10.2012 aktualisiert um 10:48:37 Uhr
Goto Top
Moin,

okay, ersteinmal danke. Vieles das ich nun erstmal durchs WWW suchen muss, noch nie mit gearbeitet oder gehört, kommt davon wenn man zu wenig mit makros und VBS arbeitet... Aber das is denke ich der richtige Anstoß in die richtige Richtung. Werd mich da mal durchbeißen und dann wieder melden bei Fragen.

Gruß Zero

EDIT: Was mir gerade auffällt: Das sind CSV Datein... keine XLS... bin nun zwar grad leicht verwirrt wieso, aber so isses. Habs oben auch in der Beschreibung geändert
ColdZero89
ColdZero89 12.10.2012 aktualisiert um 11:39:34 Uhr
Goto Top
Moin,

so ich hab mich nun entschlossen Stück für Stück das Script aufzubauen. Scheitern tut es aber schon daran das er die nicht mal öffnen will. Folgende Fehlermeldung erhalte ich beim ausführen dieses Scriptes:

@echo on & setlocal

rem Script zum Auslesen der csv Datein von Saarbrücken 1
rem V1.0a Suche mit festem Datum nach Monatswerten in Datei von PVU1

set DATUM=30.09.2012
set ZEIT=23:50
set DATEI=D:\PFAD\SAARBRUECKEN_TEST\

rem Abfrage nach gesuchtem Datum
rem set /p Datum=Bitte Datum im Format TT.MM.JJJJ angeben: 

set "S=%temp%\Saarbruecken_Datenauswertung.vbs  
> "%S%" echo Set fso = CreateObject("Scripting.FileSystemObject")  
>> "%S%" echo Set oXL = CreateObject("Excel.Application")   
>> "%S%" echo Const xlCellValue = 1   
>> "%S%" echo Const xlGreater = 5  
>> "%S%" echo For Each oExcelDatei In fso.GetFolder("%DATEI%").Files   
>> "%S%" echo If LCase(fso.GetExtensionName(oExcelDatei.Name)) = "csv" Then   
>> "%S%" echo oXL.Workbooks.Open oExcelDatei.Path   
>> "%S%" echo End If  
>> "%S%" echo Next  

d:\Temp\Saarbruecken_Datenauswertung.vbs(9, 1) Kompilierungsfehler in Microsoft VBScript: 'Next' erwartet

- AH 'n Next fehlte.

Gut nun wird mir keine Fehlermeldung mehr angezeigt, dennoch öffnet der die Datei im Ordner nicht... dabei sagt doch oXL.Workbooks.Open oExcelDatei.Path doch "Öffne Datei mit Endung CSV in Pfad XY" oder nicht?

Gruß Zero

EDIT: Was mir grad auffällt, ein Prozess von EXCEL.exe wird aber gestartet... startet das Script die Excel etwa im Hintergrund im Hiddenmode?
EDIT2: Scheint so, nach einem Start von Excel meckert Excel mich an das genau die Datei die ich öffnen wollte, mehrmals nicht gespeichert wurde face-smile Gut zu wissen. Heißt also nun weiter machen, denn es funktioniert ja, nur halt im Hiddenmode.

EDIT3+Frage: Suchbereich und co ist nun einegstellt, wonach er suchen soll ebenfalls. Wie verklicker ich dem jetzt nur "Kopiere mir Spalte A, T, AO, BJ und CE und das ganze dann steckste mir in ne Datei (CSV wie bastla vorgeschlagen hat). Diese existiert bereits, hatn Namen (Monat_PVU1.csv) Spalte A-E sind beschriftet. Fehlen halt nur noch die daten. Möchte halt ungern mit dem Offset und co arbeiten... das wäre ne doofe abzählerrei und hach... face-smile
76109
76109 12.10.2012 aktualisiert um 12:01:01 Uhr
Goto Top
Hallo ColdZero89!

Wenn Du Workbooks öffnest. dann musst Du sie nach der Bearbeitung logischerweise auch wieder schließen. Mit 'Close False' wird es unverändert wieder geschlossen.

Sichtbar würde das Ganze mit 'oXL.Visible = True'

>> "%S%" echo For Each oExcelDatei In fso.GetFolder("%DATEI%").Files  
>> "%S%" echo If LCase(fso.GetExtensionName(oExcelDatei.Name)) = "csv" Then  
>> "%S%" echo Set Wkb1 = oXL.Workbooks.Open(oExcelDatei.Path)  
>> "%S%" echo Set Wks1 = Wkb1.Sheets^(1^)  
>> "%S%" echo 'Mach mit dem 1. Sheet irgendwas  
>> "%S%" echo Wkb1.Close False  
>> "%S%" echo End If  
>> "%S%" echo Next  

Bei mehreren Such-Parametern, empfielt sich die AutoFilter-Funktion zu nutzen... Da musst Du nix suchen, sonderen nur das Filter-Ergebnis kopieren.

Gruß Dieter
ColdZero89
ColdZero89 12.10.2012 aktualisiert um 14:34:19 Uhr
Goto Top
Moin,

danke Dieter.
Ja AutoFilter hört sich an sich nett an, dennoch gibt es denke ich ein Problem.
1. Ich brauche aus 10082 Zeilen nur EINE Zeile. In dieser Zeile steht Datum und Uhrzeit (30.09.2012 23:50)
2. In der einen Zeile brauch ich aus den Zeilen A bis CO (Keine Ahnung wieviele das sind, keine lust zu zählen) nur genau 4 Werte.
3. In der Tabelle gibt es für die Werte die ich brauche jeweils pro WR (1-4) 2 Spalten - ich weiß nicht wieso und dies zu ergründen würde 2 externe Firmen mit einbeziehen, zuviel aufwand - somit hätte ich 8 Werte, ich brauch aber nur 4.
Die 2 Spalten heißen dann auch noch gleich, heißt wenn ich mit Filter an die Arbeit gehen würde hätte ich nachher 9 Spalten - Datum+Uhrzeit und die WR(1-4)_Monatsenergie. Daher fällt eine Filterfunktion aus, außer du hast ne Idee wie ich genau das Problem mit den doppelten Spalten im Filter beseitigt bekomme.

EDIT: Eben so umgeschrieben das er es auch wieder schließt, genau die Zeile muckt er an ">> "%S%" echo echo Wkb1.Close False" mit folgender Fehlermeldung: d:\Users\kela\AppData\Local\Temp\Saarbruecken_Datenauswertung.vbs(11, 17) Kompilierungsfehler in Microsoft VBScript: Anweisungsende erwartet
Script:
@echo off & setlocal
set "S=%temp%\Saarbruecken_Datenauswertung.vbs  
> "%S%" echo Set fso = CreateObject("Scripting.FileSystemObject")  
>> "%S%" echo Set oXL = CreateObject("Excel.Application")   
>> "%S%" echo Const xlCellValue = 1   
>> "%S%" echo Const xlGreater = 5  
>> "%S%" echo For Each oExcelDatei In fso.GetFolder("%DATEI%").Files   
>> "%S%" echo If LCase(fso.GetExtensionName(oExcelDatei.Name)) = "csv" Then   
>> "%S%" echo set Wkb1 = oXL.Workbooks.Open(oExcelDatei.Path)  
>> "%S%" echo Set Wks1 = Wkb1.Sheets^(1^)   
>> "%S%" echo For Suchbereich = 1 to 15000  
>> "%S%" echo If Cells (Suchbereich, 1) = "%DATUM% %ZEIT%" then  
>> "%S%" echo echo Wkb1.Close False   
>> "%S%" echo End If  
>> "%S%" echo Next  

cscript //nologo "%S%"  
Dachte nun gut die Zeilen mit "Suchbereich" bringen den Fehler, nehme ich die raus meckert er mit der selben Meldung in Zeile 9.

EDIT2: Aber schließen tut er es dennoch weider - kein Prozess mehr offen - ich bin verwirrt face-big-smile

Gruß Zero
76109
76109 12.10.2012 um 14:51:14 Uhr
Goto Top
Hallo Zero!

Jepp, das doppelte echo in Codezeile 13 ist natürlich ein Copy/Paste-Fehlerface-wink

Die AutoFilter-Funktion funktioniert schon, weil es ja Dir obliegt, welche Spalten Du kopieren willst. Die Filter-Funktion soll eben nur die betreffende Zeile ermitteln.

Gruß Dieter
ColdZero89
ColdZero89 12.10.2012 aktualisiert um 15:21:02 Uhr
Goto Top
Moin,

und danke das hab ich gar net gesehen face-big-smile Ich trag schon ne Brille ^^

ja durch die Funktion schaffe ich es das NUR die Zeile mit gewähltem Datum und der Uhrzeit angezeigt werden.
Dennoch möchte ich ja nicht von Spalte A bis CO alles kopieren. Wie kann ich dem auf die Nase drücken: Kopiere NUR die spalten A, T, AO, BJ und CE in der Zeile in der das Datum und die Uhrzeit übereinstimmen?

Ich war am überlegen das mit dem Makroaufnahmeprogramm einmal durchzuführen wie der eine "STRG" Taste interpretiert, also welche Funktion das ist. Wäre das einzige was mir patu einfällt.

EDIT: Okay beim Aufzeichnen makiert er die einzelnen Felder dann so: Range("A1,A10072,T10072,AO10072,BJ10072").Select
Kopieren konnt ich sie nur net, da meckert der dann nämlich face-big-smile aber auch schön das ich nun ein beispiel wo ich weiß die Zeile ist genau die 10072 und keine andere, das kann in jeder anderen Datei halt anders aussehen. Es ist zum Haare raufen! Das muss doch simpel möglich sein ohne großes hin und her...

Gruß zero
76109
76109 12.10.2012 aktualisiert um 15:33:53 Uhr
Goto Top
Hallo Zero!

Diese Codezeile hat mit dem Suchergebnis nix zu tun
>> "%S%" echo Wkb1.Close False  
und muss von daher vor der Next-Anweisung stehen.

Es macht ja keinen Sinn ein Workbook nur wieder zu schließen, wenn ein Suchergebnis erfolgreich warface-wink

Für die AutoFilter-Funktion brauchst keine Strg-Taste. Das Ding heißt AutoFilter und läßt sich auch über AutoFilter im Code ansprechenface-wink. Aber zunächst wäre es erstmal hilfreich zu wissen, in welchen Spalten das Datum und die Zeit zu finden sind?

Und magst Du eventuell noch erwähnen, wo die Begriffe 'PVU1' und 'PVU2' im Sheet zu finden sind?

Gruß Dieter
ColdZero89
ColdZero89 12.10.2012 aktualisiert um 15:53:23 Uhr
Goto Top
Moin,

also einmal danke - habs grad umgestellt, stimmt ist logisch face-smile

Datum und Zeit sind im Format TT.MM.JJJJ HH:MM in Spalte A zu finden.

PVU1 und PVU2 stehen nur in den Dateinamen (20121001_PVU1.csv) und sind der Begriff für die zusammenfassung von mehreren Wechselrichtern (PVU1 hat 4 WRs und PVU2 nur 2). Im Sheet also gar nicht. Dort lauten die Spaltennamen um die es geht:
Datum Uhrzeit WR1_MONATSENERGIE WR2_MONATSENERGIE WR3_MONATSENERGIE WR4_MONATSENERGIE

Bin nur am überlegen es nun in ne CSV durch ; zu trennen oder in ne Excel datei reinzuschmeißen. Denke CSV wäre einfacher umzusetzen, die Werte nehmen durch ; trennen und rein damit.

Einer meiner nächsten Schritte den ich gehen würde wenn das Script steht. Eine Vorabauswahl zu machen welche Datei in dem Ordner mit dem Script gerade liegt, damit der Pfad bzw. der Name der Fortlaufenden CSV Datei, in der die Daten neu gespeichert werden, in die VBS übergeben wird.

Gruß Zero
76109
76109 12.10.2012 um 18:38:25 Uhr
Goto Top
Hallo Zero!

Mit dem Zeit-Format (30.09.2012 23:50) versagt die Such- und Filter-Funktion höchstwahrscheinlich. Von daher dann doch eine Zell-Durchsuchung ala:
    TestZeit = "30.09.2012 23:50"  
    
    If IsDate(TestZeit) Then
    
        FoundLine = 0
        
        For Each Cell In WksE.Range("A:A")  
            If Cell.Text = "" Then  
                Exit For
            ElseIf Left(Cell.Text, 16) = TestZeit Then  'Mit Left Sekunden abschneiden  
                FoundLine = Cell.Row:  Exit For
            End If
        Next
        
        If FoundLine > 0 Then
            'Mach was  
        End If
    
End If

Gruß Dieter
bastla
bastla 12.10.2012 aktualisiert um 21:00:31 Uhr
Goto Top
Hallo ColdZero89!

Würdest Du Dich da nicht "durchbeißen" wollen (und wärst inzwischen zusammen mit Dieter noch nicht soweit damit gekommen face-smile), hätte ich ja gesagt: Filtere einfach die Zeilen per Batch, zerlege das Ergebnis mit VBS (bzw, je nach Struktur der Daten - eine Beispielzeile würde helfen, das abzuschätzen - uU sogar auch mit Batch) und erstelle als Ergebnis eine CSV ...

Grüße
bastla
76109
76109 13.10.2012 um 15:36:06 Uhr
Goto Top
Hallo Zero!

Da Du ja unbedingt Batch verwenden willst und es sich ja ausschließlich um Csv-Dateien handelt und nur ein Suchparameter gegeben ist, würde ich mich der Meinung von bastla anschließen und dann auch lieber alles per Batch erledigen wollenface-wink

Gruß Dieter
ColdZero89
ColdZero89 15.10.2012 aktualisiert um 09:26:19 Uhr
Goto Top
Moinsen meine lieben face-smile

was ein wunderbar kalter außerdem in Hamburg *brrrrr*

An sich ist die Idee ja nicht schlecht, nur wie soll das ohne Spalten und Zeilen sauber funktionieren? Das übersteigt gerade meinen Horizont.

Außerdem soll die Suche nachher Variabel gestaltet werden. Fixvariable in dem Konstrukt bleibt die Zeit (23:50). Das Datum soll nachher aber eingegeben werden von meinem Chef, sodass das Script nicht immer umgeschrieben werden muss.

Eine Beispielzeile? face-big-smile gerne
Bemerkung: Datum Uhrzeit ist EINE Spalte.

Spaltenüberschrift mit den Werten da drunter. Beispiel Werte aus 23:50 (Da steht die Anlage schon still, daher vieles auf 0)
Datum Uhrzeit Modulstrahlung_M1 Modulstrahlung_M2 Modulstrahlung_M3 Modultemperatur_M1 Modultemperatur_M2 Modultemperatur_M3 Raumtemperatur Umgebungstemperatur WR1_GESAMTENERGIE WR1_I_AC_L1 WR1_I_AC_L2 WR1_I_AC_L3 WR1_I_DC_IST WR1_I_DC_STRING1 WR1_I_DC_STRING2 WR1_I_DC_STRING3 WR1_JAHRESENERGIE WR1_KUEHLKOERPERTEMP WR1_MONATSENERGIE WR1_MONATSENERGIE WR1_P_AC_IST WR1_P_DC_IST WR1_Q_AC_IST WR1_Riso WR1_TAGESENERGIE WR1_U_AC_L1 WR1_U_AC_L2 WR1_U_AC_L3 WR1_U_DC_IST WR2_GESAMTENERGIE WR2_I_AC_L1 WR2_I_AC_L2 WR2_I_AC_L3 WR2_I_DC_IST WR2_I_DC_STRING1 WR2_I_DC_STRING2 WR2_I_DC_STRING3 WR2_JAHRESENERGIE WR2_KUEHLKOERPERTEMP WR2_MONATSENERGIE WR2_MONATSENERGIE WR2_P_AC_IST WR2_P_DC_IST WR2_Q_AC_IST WR2_Riso WR2_TAGESENERGIE WR2_U_AC_L1 WR2_U_AC_L2 WR2_U_AC_L3 WR2_U_DC_IST WR3_GESAMTENERGIE WR3_I_AC_L1 WR3_I_AC_L2 WR3_I_AC_L3 WR3_I_DC_IST WR3_I_DC_STRING1 WR3_I_DC_STRING2 WR3_I_DC_STRING3 WR3_JAHRESENERGIE WR3_KUEHLKOERPERTEMP WR3_MONATSENERGIE WR3_MONATSENERGIE WR3_P_AC_IST WR3_P_DC_IST WR3_Q_AC_IST WR3_Riso WR3_TAGESENERGIE WR3_U_AC_L1 WR3_U_AC_L2 WR3_U_AC_L3 WR3_U_DC_IST WR4_GESAMTENERGIE WR4_I_AC_L1 WR4_I_AC_L2 WR4_I_AC_L3 WR4_I_DC_IST WR4_I_DC_STRING1 WR4_I_DC_STRING2 WR4_I_DC_STRING3 WR4_JAHRESENERGIE WR4_KUEHLKOERPERTEMP WR4_MONATSENERGIE WR4_MONATSENERGIE WR4_P_AC_IST WR4_P_DC_IST WR4_Q_AC_IST WR4_Riso WR4_TAGESENERGIE WR4_U_AC_L1 WR4_U_AC_L2 WR4_U_AC_L3 WR4_U_DC_IST
30.09.2012 23:50 2,7 0 0 -3,5 0 3276,7 0 3,4 3126069 0 0 0 0 0 0 0 419178 28 48850 48850 0 0 0 5000 2150,7 225 226 226 0 3182085 0 0 0 0 0 0 0 430470 31 48618 48618 0 0 0 5000 2522 224 226 226 0 3206357 0 0 0 0 0 0 0 437040 28 50693 50693 0 0 0 5000 2458,6 227 226 226 0 2880292 0 0 0 0,2 0 0 0 377779 28 38890 38890 0 0 0 5000 1927,8 226 225 226 1,25

Die Spalten die ich brauche sind IMMER der erste WRX_Monatsenergie. Warum dort 2 stehen, weiß ich nicht und wie erwähnt zieht das 2 externe Firmen mit damit das Programm was das aufzeichnet behandelt wird -> Zuviel aufwand.

Gruß Zero
bastla
bastla 15.10.2012 um 13:16:08 Uhr
Goto Top
Hallo ColdZero89!

Was Du da gepostet hast, ist aber eine Zeile aus einer BSV (blank separated values)-Datei ...

Setze das bitte mal unter Code-Tags, damit zumindest erkennbar wird, ob ev TAB als Trennzeichen verwendet wird (würde ich hinsichtlich
Datum Uhrzeit ist EINE Spalte.
annehmen).

Grüße
bastla
ColdZero89
ColdZero89 15.10.2012 aktualisiert um 13:24:33 Uhr
Goto Top
Moin,

ok nun einmal im Editor geöffnet. Hier die Zeile mit den Überschriften und dann der Werte.
Datum Uhrzeit;Modulstrahlung_M1;Modulstrahlung_M2;Modulstrahlung_M3;Modultemperatur_M1;Modultemperatur_M2;Modultemperatur_M3;Raumtemperatur;Umgebungstemperatur;WR1_GESAMTENERGIE;WR1_I_AC_L1;WR1_I_AC_L2;WR1_I_AC_L3;WR1_I_DC_IST;WR1_I_DC_STRING1;WR1_I_DC_STRING2;WR1_I_DC_STRING3;WR1_JAHRESENERGIE;WR1_KUEHLKOERPERTEMP;WR1_MONATSENERGIE;WR1_MONATSENERGIE;WR1_P_AC_IST;WR1_P_DC_IST;WR1_Q_AC_IST;WR1_Riso;WR1_TAGESENERGIE;WR1_U_AC_L1;WR1_U_AC_L2;WR1_U_AC_L3;WR1_U_DC_IST;WR2_GESAMTENERGIE;WR2_I_AC_L1;WR2_I_AC_L2;WR2_I_AC_L3;WR2_I_DC_IST;WR2_I_DC_STRING1;WR2_I_DC_STRING2;WR2_I_DC_STRING3;WR2_JAHRESENERGIE;WR2_KUEHLKOERPERTEMP;WR2_MONATSENERGIE;WR2_MONATSENERGIE;WR2_P_AC_IST;WR2_P_DC_IST;WR2_Q_AC_IST;WR2_Riso;WR2_TAGESENERGIE;WR2_U_AC_L1;WR2_U_AC_L2;WR2_U_AC_L3;WR2_U_DC_IST;WR3_GESAMTENERGIE;WR3_I_AC_L1;WR3_I_AC_L2;WR3_I_AC_L3;WR3_I_DC_IST;WR3_I_DC_STRING1;WR3_I_DC_STRING2;WR3_I_DC_STRING3;WR3_JAHRESENERGIE;WR3_KUEHLKOERPERTEMP;WR3_MONATSENERGIE;WR3_MONATSENERGIE;WR3_P_AC_IST;WR3_P_DC_IST;WR3_Q_AC_IST;WR3_Riso;WR3_TAGESENERGIE;WR3_U_AC_L1;WR3_U_AC_L2;WR3_U_AC_L3;WR3_U_DC_IST;WR4_GESAMTENERGIE;WR4_I_AC_L1;WR4_I_AC_L2;WR4_I_AC_L3;WR4_I_DC_IST;WR4_I_DC_STRING1;WR4_I_DC_STRING2;WR4_I_DC_STRING3;WR4_JAHRESENERGIE;WR4_KUEHLKOERPERTEMP;WR4_MONATSENERGIE;WR4_MONATSENERGIE;WR4_P_AC_IST;WR4_P_DC_IST;WR4_Q_AC_IST;WR4_Riso;WR4_TAGESENERGIE;WR4_U_AC_L1;WR4_U_AC_L2;WR4_U_AC_L3;WR4_U_DC_IST
30.09.2012 23:50:00;2,70;0,00;0,00;-3,50;0,00;3276,70;0,00;3,40;3126069,00;0,00;0,00;0,00;0,00;0,00;0,00;0,00;419178,00;28,00;48850,00;48850,00;0,00;0,00;0,00;5000,00;2150,70;225,00;226,00;226,00;0,00;3182085,00;0,00;0,00;0,00;0,00;0,00;0,00;0,00;430470,00;31,00;48618,00;48618,00;0,00;0,00;0,00;5000,00;2522,00;224,00;226,00;226,00;0,00;3206357,00;0,00;0,00;0,00;0,00;0,00;0,00;0,00;437040,00;28,00;50693,00;50693,00;0,00;0,00;0,00;5000,00;2458,60;227,00;226,00;226,00;0,00;2880292,00;0,00;0,00;0,00;0,20;0,00;0,00;0,00;377779,00;28,00;38890,00;38890,00;0,00;0,00;0,00;5000,00;1927,80;226,00;225,00;226,00;1,25
Wie mir schenit ist das Trennzeichen ein Semikolon.

Gruß Zero

P.S.: nun wird es hier scheinbar nicht richtig angezeigt. Daher hab ich das einfach mal in CODE gepackt
bastla
bastla 15.10.2012 aktualisiert um 13:54:58 Uhr
Goto Top
Hallo ColdZero89!

Ist zwar in Batch only etwas tricky (weil ja nun eigentlich nur die Übergabeparameter %1 bis %9 unterstützt werden - Abhilfe schafft hier die nötige Anzahl an "shift"), ließe sich aber zur Not etwa so umsetzen:
@echo off & setlocal enabledelayedexpansion
set "Ein=PFAD\_tagesauslesung_z„hlerst„nde.xls"  
set "Aus=PFAD\Anlagenabfrage fr FlexCtrl + CCC.csv"  

set "Zeit=23:50"  
set /p "Datum=Bitte Datum im Format TT.MM.JJJJ eingeben:   

del "%Aus%" 2>nul  
for /f "delims=" %%i in ('findstr "%Zeit%" "%Ein%"^|findstr "%Datum%"') do (  
    set "ZeileEin=%%i"  
    set "ZeileEin=!ZeileEin:,=@!"  
    call :ProcessLine !ZeileEin:;= !
)
goto :eof

:ProcessLine
set "ZeileAus=%Datum% %Zeit%"  
for /l %%a in (1,1,20) do shift
set "ZeileAus=%ZeileAus%;%1"  
for /l %%a in (1,1,21) do shift
set "ZeileAus=%ZeileAus%;%1"  
for /l %%a in (1,1,21) do shift
set "ZeileAus=%ZeileAus%;%1"  
for /l %%a in (1,1,21) do shift
set "ZeileAus=%ZeileAus%;%1"  
>>"%Aus%" echo %ZeileAus:@=,%  
goto :eof
Kurz zu den Zeilen 11 und 26: Da ein Komma als Trennzeichen zwischen Übergabeparametern interpretiert wird, ersetze ich es vorübergehend durch "@" bzw mache das dann bei der Ausgabe wieder rückgängig.

In Zeile 12 erfolgt eine weitere Ersetzung: Semikolon wird zu Leerzeichen, wodurch alle Felder als einzelne Parameter im Unterprogramm ankommen (soferne es nicht leere Felder - also auch ohne Angabe von 0 - gibt).

Im Unterprogramm werden dann die Spalten so verschoben, dass jeweils der gesuchte Wert als %1 in die Ausgabezeile übernommen werden kann (bei nur max 4 Werten sollte das auch noch ohne Schleife außen herum akzeptabel sein).
Alternativ wäre es natürlich möglich, die jeweilige Zeile (oder auch mehrere Zeilen als Inhalt einer TEMP-Datei) an ein VBScript zu übergeben, dort per "Split()" die gesuchten Feldwerte zu extrahieren, als Ausgabezeile zusammen zu setzen und mit "WScript.Echo" wieder an den Batch zu retournieren ...

Grüße
bastla
ColdZero89
ColdZero89 15.10.2012 um 14:40:54 Uhr
Goto Top
Moin bastla,

Danke erstmal, aber das kommata ist nur ein Trennzeichen der Nullen... also nachkommatastellen. das muss also drinnen bleiben. Das Semikolon trennt die Spalten. Nehme also das mit dem kommata weg.

Wie weiß ich denn nun das er tatsächlich nur die Minutenenergiewerte nimmt und nicht andere?

Wenn ich das richtig sehe löscht du die Aus-Datei in Zeile 8. Diese soll aber auch bleiben damit dies fortlaufend geschrieben werden kann.

An sich hät ich das aber gern in VBS, da das Script dann erweitert werden soll um eine Auswahl ob Datein von Saarbrücken 1 oder 2 im Ordner liegen.

Saarbrücken 1 hat PVU1 und PVU2 - eine weiteres auswahlmenü.
Bei Saarbrücken 2 wären es 7 Datein die nacheinander durchforstet werden sollen und in eine neue Datei angehängt werden sollten.
Mit VBS wüsste ich dann wie ich das so schön erweitere und das Gerüst aus Batch drum herum mach.

Gruß Zero
bastla
bastla 15.10.2012 aktualisiert um 15:08:30 Uhr
Goto Top
Hallo ColdZero89!
aber das kommata ist nur ein Trennzeichen der Nullen... also nachkommatastellen. das muss also drinnen bleiben.
Tut es ja auch (genauer: wird in Zeile 26 wieder eingefügt) - oder hätte Dein Test ein anderes Ergbnis gebracht?
Wenn ich das richtig sehe löscht du die Aus-Datei in Zeile 8. Diese soll aber auch bleiben damit dies fortlaufend geschrieben werden kann.
Zeile 8 ersatzlos streichen? face-wink
An sich hät ich das aber gern in VBS
das Gerüst aus Batch drum herum
Wie weit soll demnach Batch gehen, was soll in VBS umgesetzt werden?

Grüße
bastla
ColdZero89
ColdZero89 15.10.2012 um 15:14:23 Uhr
Goto Top
Moin,

Zeile 8 würd ich ersatzlos streichen... für mich isses nur das der Befehl die Datei löscht.

Batch soll das ganze mit den Variablen beherrschen. also das Set gedöns mit dem Auswahlmenü, den Programmsprüngen aufgrund der Auswahl der jeweiligen Option.

VBS soll in die Datei dann, Zeile suchen, Inhalt den ich brauche Kopieren und den kram.
Bei Saarbrücken 2 würde ich das so machen das in der Schelife ein Zähler immer hoch zählt und dann die Variablen fest setzt die benötigt werden für die Öffnung der Datei usw.

Gruß Zero
bastla
bastla 15.10.2012 um 16:04:52 Uhr
Goto Top
Hallo ColdZero89!
VBS soll in die Datei dann, Zeile suchen, Inhalt den ich brauche Kopieren und den kram.
Genau das macht doch aber der Batch von oben - und wenn es darum geht, nicht nur aus einer Datei die entsprechenden Zeilen zu filtern, dann brauchst du das erste "findstr" ganz einfach nur auf mehrere Dateien anzuwenden - also etwa:
for /f "delims=" %%i in ('findstr "%Zeit%" "PFAD\_tagesauslesung_*.*"^|findstr "%Datum%"') do (
und kannst so alle Zeilen aus allen passenden Dateien in einem Arbeitsgang erledigen ...

Wenn es übrigens in einer Datei nur 2 anstelle von 4 Werten gibt, die zu übernehmen sind, enthält die erstellte CSV einfach am Ende ";;", also zwei Leerspalten - davon merkst Du nach dem Öffnen in Excel gar nix mehr ...

Grüße
bastla
ColdZero89
ColdZero89 15.10.2012 um 16:44:42 Uhr
Goto Top
Moin,

danke bastla, ich teste das morgen mal Umfangreich.

Eventuell bau ich noch einen Part ein der die ,, löscht. Da wenn ich bei Saarbrücken 2 aus 7-Datein das ziehe, damit das weg ist.

Ich mach nun aber Feierabend.

Gruß Zero
bastla
bastla 15.10.2012 um 16:47:53 Uhr
Goto Top
Hallo ColdZero89!
Eventuell bau ich noch einen Part ein der die ,, löscht. Da wenn ich bei Saarbrücken 2 aus 7-Datein das ziehe, damit das weg ist.
Könnte etwa so aussehen:
if "%1" neq "" set "ZeileAus=%ZeileAus%;%1"
Grüße
bastla
ColdZero89
ColdZero89 16.10.2012 aktualisiert um 11:12:52 Uhr
Goto Top
Guten Morgen liebe Sorgen face-big-smile
Die Sonne scheint, es ist kalt, aber ich bin fröhlich.

bastla, was ich gerade gesehen habe die Datei die du einließt ist eine XLS - die Datei die ich einlese ist eine CSV. Ändert das was?

EDIT: Ok ändert nichts.
Was mich nun aber verdutzt - liegt daran das ich da kaum durchsteige und auch echt nicht weiß wie er GENAU die Minutenenergie raus zieht - wenn ich die Headline habe und das Script das erste mal ausführe, dann schreibt er es einfach dahinter in die erste Zeile. Wo im Script sag ich dem denn nun: Schmeiß mir das erst ab der 2ten Zeile rein? face-smile

Außerdem frage ich mich wie das funktionieren soll mit 7 Datein... schreibt er dann die 7 Werte hintereinander Weg oder untereinander - da jedes mal ne neue Datei. Wo bestimmt man das in dem Script? face-big-smile
Ich möchts halt komplett verstehen um auch selbst testen und spielen zu können.

Gruß Zero

EDIT2: Problem mit dem fehlendem Zeilenumbruch scheint sich dadurch aufzulösen wenn ich die CSV mit dem Editor öffne und eine Leerzeile einfach durch ein Enter einfüge.

EDIT3: Bei Mehreren Datein schreibt er das untereinander Weg.
Ich würde das Batch nun so erweitern, das ausgewählt werden kann: Saarbrücken 2 und PVU1 oder PVU2 oder Saarbrücken 1. Bei Saarbrücken 1 würden dann die 7 Datein sein, kann man es erreichen das er beim ersten nur das Datum kopiert (Datei 1) und bei den anderen 6 NUR die werte und diese dann in eine Zeile schmeißt?Pro PVU (1-7) fallen 2 WRs an.
Das Auswahlmenü, die dazugehörigen Programmabschnitte in die er dann springen soll ist einfach und schnell gemacht. Je nachdem in welchem Programmabschnitt er springt, setzt er die Aus-Datei neu.

Um eine Art Loop zu erzeugen - das Programm wird erst beendet wenn Ende betätigt wird - kann ich doch dem Auswahlmenü einen eigenen Programmabschnitt geben (:menu), nach jedem Programm wird dann automatisch wieder ins Menü gesprungen.
Zur folge hätte dies nur das die Dateinamen Ausgelesen werden müssten. PVU1 und PVU2 für Saarbrücken 2. Saarbrücken 1 würde ich einmal komplett durchlaufen lassen (Die namen der Datein heißen wie folgt für Saarbrücken 1 und 2: 20121001_PVU1.csv und 20121001_PVU2.csv und dann weiter mit 3 usw. Daher ist es nicht möglich Saarbrücken 2 und Saarbrücken 1 in einem Ordner zu halten. Einzig könnte man unterordner schaffen, in den die Jeweiligen reinkopiert werden. Somit einmal alles reinkopieren in die ordner, dann das Menü nacheinander ausführen - Je nachdem welche Daten gerade verfügbar sind oder welche man auslesen will.

Ich merk schon... wird ziemlich groß das ding.
ColdZero89
ColdZero89 16.10.2012 aktualisiert um 11:52:10 Uhr
Goto Top
Moin,

ich habe das Script nun erweitert.

2 Probleme bekomm ich aber irgendwie nicht gelöst.
Punkt 1 die Überprüfung des Datums in Zeile 09-14
Punkt 2 bei der Case_4 in Zeile 47 springt er nicht richtig zum EOF. Selbst wenn ich wie bei mir nun :eof setze, skuril.

Eine Frage die mir noch brennt: Wie kann ich Abfragen ob AW 1-4 ist bzw. eben nicht 1-4 ist sondern irgendwas anderes, das er dann genau das macht was er tut, zurückspringen?

@echo off & setlocal enabledelayedexpansion

set AW=0
set "Zeit=23:50"  

:datum
set /p "Datum=Bitte Datum im Format TT.MM.JJJJ eingeben:   

if %Datum% NEQ ??.??.???? (
	echo =======================================================
	echo Fehler! Datum muss im Format TT.MM.JJJJ eingegeben werden.
	echo =======================================================
	GOTO :datum
	)
	
:menu
echo Bitte Auswahl der Anlage treffen
echo [1] Saarbrücken 1
echo [2] Saarbrücken 2 PVU1
echo [3] Saarbrücken 2 PVU2
echo [4] Programmende
set /p AW=Bitte Auswahlnummer eingeben: 

If %AW%==0 (
	echo =======================================================
	echo Fehler! Auswahl muss eine Zahl von 1-4 sein.
	echo =======================================================
	GOTO :menu
	)
	
GOTO CASE_%AW%
	:CASE_1
		echo =======================================================
		echo Programm für Saarbrücken 1 wird ausgeführt
		echo =======================================================
	GOTO SAA1
	:CASE_2
		echo =======================================================
		echo Programm für Saarbrücken 2 PVU1 wird ausgeführt
		echo =======================================================
	GOTO SAA2PVU1
	:CASE_3
		echo =======================================================
		echo Programm für Saarbrücken 2 PVU2 wird ausgeführt
		echo =======================================================
	GOTO SAA2PVU2
	:CASE_4
	GOTO eof

:SAA2PVU1
set "Ein=PFAD\"  
set "Aus=PFAD\Monat_PVU1.csv"  
GOTO Umwandeln

:SAA2PVU2
set "Ein=PFAD\"  
set "Aus=PFAD\Monat_PVU2.csv"  
GOTO Umwandeln

:Umwandeln
for /f "delims=" %%i in ('findstr "%Zeit%" "%Ein%\*.csv"^|findstr "%Datum%"') do (  
    set "ZeileEin=%%i"  
    set "ZeileEin=!ZeileEin:,=@!"  
    call :ProcessLine !ZeileEin:;= !
)
echo Fehler bei der Ausführung
GOTO :menu

:ProcessLine
set "ZeileAus=%Datum% %Zeit%"  
for /l %%a in (1,1,20) do shift
set "ZeileAus=%ZeileAus%;%1"  
for /l %%a in (1,1,21) do shift
set "ZeileAus=%ZeileAus%;%1"  
for /l %%a in (1,1,21) do shift
set "ZeileAus=%ZeileAus%;%1"  
for /l %%a in (1,1,21) do shift
set "ZeileAus=%ZeileAus%;%1"  
>>"%Aus%" echo %ZeileAus:@=,%  
set AW=0
GOTO :menu
:eof

Gruß Zero
bastla
bastla 16.10.2012 um 12:33:17 Uhr
Goto Top
Hallo ColdZero89!

Datumseingabe kannst Du (als Ersatz der Zeilen 9 und 14) so prüfen:
echo %Datum%|findstr /x "[0-3][0-9]\.[0-1][0-9]\.20[1-9][0-9]">nul && goto :menu
(ein Datum vor 2010 und nach 2099 ist so nicht möglich).

Für die Eingabe von 1 bis 4 kannst Du das analog machen ...

Grüße
bastla
ColdZero89
ColdZero89 16.10.2012 aktualisiert um 12:55:25 Uhr
Goto Top
Moin bastla,

ha stimmt! Das hatten wir so schon mal. bei der 20[1-9][0-9] einfach in genau das ändern: 2[0-9][0-9][0-9] fertig face-big-smile

Manchmal frag ich mich wo mein hirn is face-big-smile

was bedeutet eigentlich das >nul ?

Für 1-4 würde es dann so aussehen

echo %AW%|findstr /x "[1-4]">nul && goto :menu
?

Gruß Zero

EDIT: so prüft er das aber nicht. So akzeptiert er das datum. Wenn ich als beispiel 1.1.1 eingebe macht er dennoch weiter.
Bin ich grad nur begriffsstutzig oder hab ich was übersehen?
bastla
bastla 16.10.2012 um 15:53:22 Uhr
Goto Top
Hallo ColdZero89!
Bin ich grad nur begriffsstutzig oder hab ich was übersehen?
Kannst eigentlich nur Du beantworten ... face-wink

Ein Test direkt in der CMD-Shell sähe etwa so aus:
D:\>set Datum=1.1.1

D:\>echo %Datum%|findstr /x "[0-3][0-9]\.[0-1][0-9]\.20[1-9][0-9]">nul && echo o
k

D:\>set Datum=01.01.01

D:\>echo %Datum%|findstr /x "[0-3][0-9]\.[0-1][0-9]\.20[1-9][0-9]">nul && echo o
k

D:\>set Datum=01.01.2001

D:\>echo %Datum%|findstr /x "[0-3][0-9]\.[0-1][0-9]\.20[1-9][0-9]">nul && echo o
k

D:\>echo %Datum%|findstr /x "[0-3][0-9]\.[0-1][0-9]\.2[0-9][0-9][0-9]">nul && ec
ho ok
ok
Wegen des ">nul" wird die Ausgabe von "findstr" (entweder ohnehin nix, oder eben das passende Datum) unterdrückt - es interessiert ja nur das Ergebnis (bzw der Errorlevel, dessen Abfrage auf 0 einfach durch "&&" ersetzt werden kann) ...

Nur zur Sicherheit: Deine ursprünglichen Zeilen 10 bis 13 brauchst Du natürlich weiterhin.
echo %AW%|findstr /x "[1-4]">nul && goto :menu
müsste übrigens ebenfalls funktionieren ...

Grüße
bastla
ColdZero89
ColdZero89 17.10.2012 um 09:40:03 Uhr
Goto Top
Moin,

danke, ah - nun kapier ich. Wenn das Datum richtig geschrieben ist, geht er zum :menu. Sollte dies nicht richtig geschrieben sein führt er das && nicht aus und gehht einfach weiter. Also pack ich da danach das Echo rein und sag ihm: Geh wieder zum Datum! SOFORT! face-big-smile

Ja manchmal bin ich beschränkt und ich hab was übersehen.... was eigentlich logisch war -.-

Teste das direkt mal face-big-smile Danke bastla

Gruß Zero
ColdZero89
ColdZero89 17.10.2012 aktualisiert um 10:17:26 Uhr
Goto Top
Moinsen bastla,

so mein Script sieht nun wie folgt aus, funktioniert auch wunderbar. Einziges Problem ist nun noch PVU1. Wie kann ich das drehen und dreickseln, sodass der das nebeneinander macht die ausgabe in die neue Datei?

@echo off & setlocal enabledelayedexpansion

rem Deklaration von Variablen
set "AW=0"  
set "Zeit=23:50"  

rem Datum wird per Hand eingegeben
:datum
set /p "Datum=Bitte Datum im Format TT.MM.JJJJ eingeben:   

rem Datum wird auf Format geprüft	
echo %Datum%|findstr /X "[0-3][0-9]\.[0-1][0-9]\.2[0-9][0-9][0-9]">nul && goto :menu	  
echo =============================
echo Fehler! Datum muss im Format TT.MM.JJJJ eingegeben werden.
echo =============================
GOTO :datum	
	
rem Auswahlmenü welche Datein behandelt werden sollen	
:menu
echo Bitte Auswahl der Anlage treffen
echo [1] Saarbruecken 1
echo [2] Saarbruecken 2 PVU1
echo [3] Saarbruecken 2 PVU2
echo [4] Programmende
set /p AW=Bitte Auswahlnummer eingeben: 

rem Auswahl wird geprüft, ob Zahl zwischen 1 und 4 liegt
echo %AW%|findstr /x "[1-4]">nul && goto :wahl  
echo =============================
echo Fehler! Auswahl darf nur zwischen 1 und 4 liegen4
echo =============================
GOTO :menu

rem Springt in den ausgewählten Case und danach in den Programmabschnitt
:wahl
GOTO CASE_%AW%
	:CASE_1
		echo =============================
		echo Programm fuer Saarbruecken 1 wird ausgefuehrt
		echo =============================
	GOTO :SAA1
	:CASE_2
		echo =============================
		echo Programm fuer Saarbruecken 2 PVU1 wird ausgefuehrt
		echo =============================
	GOTO :SAA2PVU1
	:CASE_3
		echo =============================
		echo Programm fuer Saarbruecken 2 PVU2 wird ausgefuehrt
		echo =============================
	GOTO :SAA2PVU2
	:CASE_4
	GOTO :ende

rem Setzen der Variablen für die Verarbeitung der Daten von SAA2PVU1
:SAA2PVU1
set "Ein=PFAD\SAA2PVU1\"  
set "Aus=PFAD\Monat_PVU1.csv"  
GOTO Umwandeln

rem Setzen der Variablen für die Verarbeitung der Daten von SAA2PVU2
:SAA2PVU2
set "Ein=PFAD\SAA2PVU2\"  
set "Aus=PFAD\Monat_PVU2.csv"  
GOTO :umwandeln

rem Ersetzen von Zeichen
:umwandeln
for /f "delims=" %%i in ('findstr "%Zeit%" "%Ein%\*.csv"^|findstr "%Datum%"') do (  
    set "ZeileEin=%%i"  
    set "ZeileEin=!ZeileEin:,=@!"  
    call :ProcessLine !ZeileEin:;= !
)

rem Ausführendes Programm
:ProcessLine
set "ZeileAus=%Datum% %Zeit%"  
for /l %%a in (1,1,20) do shift
set "ZeileAus=%ZeileAus%;%1"  
for /l %%a in (1,1,21) do shift
set "ZeileAus=%ZeileAus%;%1"  
for /l %%a in (1,1,21) do shift
set "ZeileAus=%ZeileAus%;%1"  
for /l %%a in (1,1,21) do shift
set "ZeileAus=%ZeileAus%;%1"  
>>"%Aus%" echo %ZeileAus:@=,%  
set AW=0
GOTO :menu

rem Programmende
:ende
exit

Gruß Zero
bastla
bastla 17.10.2012 aktualisiert um 12:23:57 Uhr
Goto Top
Hallo ColdZero89!
Wie kann ich das drehen und dreickseln, sodass der das nebeneinander macht die ausgabe in die neue Datei?
Was meinst Du damit? Es werden doch alle Werte mit Trennzeichen Semikolon in eine Zeile gepackt ...
Die Zeile 88 sollte so aussehen:
goto :eof
und die bisherigen Zeilen 87 und 88 gehören in Zeile 74 ...

Grüße
bastla
ColdZero89
ColdZero89 17.10.2012 aktualisiert um 15:16:41 Uhr
Goto Top
Moin bastla,

nein funktioniert so alles chikobello :D

Zeile 88 ist so richtig, so erreiche ich den Loop. Nachdem für - als Beispiel - Saarbrücken 2 PVU1 die daten geschrieben wurden, gelangt man ins Menü zurück und kann so für PVU2 den kram machen.

Durchs drücken von 4 (mittlerweile 5, hab noch ne Datumsänderung eingebaut) beendet man das Programm dann.

Das zeile 87 und 88 genau da hingehören wo sie sind, ist deshalb so da ansonsten nach dem verarbeiten aus dem Programm gesprungen wird. Dies soll aber nicht der fall sein, erst durch gewähltes beenden wird das Programm beendet.


Bezüglich dem das die Daten durch ; getrennt werden, stimmt, funktioniert auch alles wunderbar. Einziges Problem: Sobald mehrere Datein in dem Ordner sind (Wie bei Saarbrücken 1) schreibt er dies untereinander.
Saarbrücken 1 hat Insgesamt 7 PVUs. Daher 7 Datein für eine Anlage. Die Daten aus den 7 Datein will ich aber nebeneinander geschrieben haben, nicht untereinander weg.
momentan sähe das Ergebnis wie folgt aus:

(Überschrift)Saarbrücken1
(PVU1)DATUM UHRZEIT;WR1;WR2
(PVU2)DATUM UHRZEIT;WR1;WR2
(PVU3)DATUM UHRZEIT;WR1;WR2
usw.

Aussehen soll es so:
(Überschrift)Saarbrücken 1;WR1PVU1;WR2PVU1;WR1PVU2;WR2PVU2;WR1PVU3;WR2PVU3;usw.
DATUM UHRZEIT;WR1;WR2;WR1;WR2;WR1;WR2;usw...

Verständlicher so was ich meine? ^^ ich weiß bissl kompliziert.

Gruß Zero

EDIT: Ich muss das Script nochmals erweitern. Die Datein für Saarbrücken 1 haben 18 und dann 19 für die Processline. Somit muss ich eine zweite Processline machen nur für Saarbrücken 1. Grml wieso kann nicht einfach mal alles gleich sein? -.- Script Poste ich gleich
ColdZero89
ColdZero89 17.10.2012 aktualisiert um 15:55:29 Uhr
Goto Top
Moin,

so das jetzt aktuell funktionierende Script. Fehlt nur noch das angesprochene... und ich komm nicht hinter wie das schön gemacht werden kann.

SCRIPT GEÄNDERT AUF ANMEKRUNG VON BASTLA EINEN KOMMENTAR UNTER DIESEM
@echo off & setlocal enabledelayedexpansion

rem Script zur Verarbeitung der Wochendatein von Saarbrücken/Ensheim 1+2+3 zur extrahierung der Monatswerte.
rem 1.0 Verarbeitung der Datei
rem 2.0 Erweiterung des Scriptes durch ein Menü
rem V2.0 Kevin Lange, 17.10.2012


rem Deklaration von Variablen
set "AW=0"  
set "Zeit=23:50"  

rem Programmbegrüßung
echo Programm zum Verarbeiten der Wochendatein von Saarbruecken 1+2+3
echo ==================

rem Datum wird per Hand eingegeben
:datum
set /p "Datum=Bitte Datum im Format TT.MM.JJJJ eingeben:   

rem Datum wird auf Format geprüft	
echo %Datum%|findstr /X "[0-3][0-9]\.[0-1][0-9]\.2[0-9][0-9][0-9]">nul && goto :menu	  
echo ==================
echo Fehler! Datum muss im Format TT.MM.JJJJ eingegeben werden.
echo ==================
GOTO :datum	
	
rem Auswahlmenü welche Datein behandelt werden sollen	
:menu
echo Bitte Auswahl der Anlage treffen
echo [1] Saarbruecken 1
echo [2] Saarbruecken 2 PVU1
echo [3] Saarbruecken 2 PVU2
echo [4] Datum aendern
echo [5] Programmende
set /p AW=Bitte Auswahlnummer eingeben: 

rem Auswahl wird geprüft, ob Zahl zwischen 1 und 4 liegt
echo %AW%|findstr /x "[1-5]">nul && goto :wahl  
echo ==================
echo Fehler! Auswahl darf nur zwischen 1 und 5 liegen
echo ==================
GOTO :menu

rem Springt in den ausgewählten Case und danach in den Programmabschnitt
:wahl
GOTO CASE_%AW%
	:CASE_1
		echo ==================
		echo Programm fuer Saarbruecken 1 wird ausgefuehrt
		echo ==================
	GOTO :SAA1
	:CASE_2
		echo ==================
		echo Programm fuer Saarbruecken 2 PVU1 wird ausgefuehrt
		echo ==================
	GOTO :SAA2PVU1
	:CASE_3
		echo ==================
		echo Programm fuer Saarbruecken 2 PVU2 wird ausgefuehrt
		echo ==================
	GOTO :SAA2PVU2
	:CASE_4
	GOTO :datum
	:CASE_5
	GOTO :ende

rem Setzen der Variablen für die Verarbeitung der Daten von SAA1
:SAA1
set "Ein=PFAD\SAA1"  
set "Aus=PFAD\Monat_SAA1.csv"  
GOTO :umwandelnSAA1

rem Ersetzen von Zeichen für Saarbrücken 1
:umwandelnSAA1
for /f "delims=" %%i in ('findstr "%Zeit%" "%Ein%\*.csv"^|findstr "%Datum%"') do (  
    set "ZeileEin=%%i"  
    set "ZeileEin=!ZeileEin:,=@!"  
    call :ProcessLineSAA1 !ZeileEin:;= !
)
set AW=0
GOTO :menu

rem Ausführendes Programm für Saarbrücken 1
:ProcessLineSAA1
set "ZeileAus=%Datum% %Zeit%"  
for /l %%a in (1,1,18) do shift
set "ZeileAus=%ZeileAus%;%1"  
for /l %%a in (1,1,19) do shift
set "ZeileAus=%ZeileAus%;%1"  
>>"%Aus%" echo %ZeileAus:@=,%  
GOTO :eof

rem Setzen der Variablen für die Verarbeitung der Daten von Saarbrücken 2 PVU1
:SAA2PVU1
set "Ein=PFAD\SAA2PVU1"  
set "Aus=PFAD\Monat_SAA2PVU1.csv"  
GOTO :umwandelnSAA2

rem Setzen der Variablen für die Verarbeitung der Daten von Saarbrücken 2 PVU2
:SAA2PVU2
set "Ein=PFAD\SAA2PVU2"  
set "Aus=PFAD\Monat_SAA2PVU2.csv"  
GOTO :umwandelnSAA2

rem Ersetzen von Zeichen für Saarbrücken 2
:umwandelnSAA2
for /f "delims=" %%i in ('findstr "%Zeit%" "%Ein%\*.csv"^|findstr "%Datum%"') do (  
    set "ZeileEin=%%i"  
    set "ZeileEin=!ZeileEin:,=@!"  
    call :ProcessLineSAA2 !ZeileEin:;= !
)
set AW=0
GOTO :menu

rem Ausführendes Programm für Saarbrücken 2
:ProcessLineSAA2
set "ZeileAus=%Datum% %Zeit%"  
for /l %%a in (1,1,20) do shift
set "ZeileAus=%ZeileAus%;%1"  
for /l %%a in (1,1,21) do shift
set "ZeileAus=%ZeileAus%;%1"  
for /l %%a in (1,1,21) do shift
set "ZeileAus=%ZeileAus%;%1"  
for /l %%a in (1,1,21) do shift
set "ZeileAus=%ZeileAus%;%1"  
>>"%Aus%" echo %ZeileAus:@=,%  
GOTO :eof

rem Programmende
:ende
exit

Gruß Zero
bastla
bastla 17.10.2012 um 15:38:42 Uhr
Goto Top
Hallo ColdZero89!

Du kannst das halten, wie Du willst (ist ja Dein Batch), aber richtig ist es so trotzdem nicht; den gewünschten Effekt (Rücksprung in das Menü nach Abarbeitung aller Zeilen - auch wenn's offensichtlich nur eine ist) erreichst Du mit meinem Ansatz (wäre jetzt 90 + 91 auf 81 verschieben und anstelle von 90 eben "goto :eof" als Rücksprung aus dem in Zeile 78 aufgerufenen Unterprogramm; analog dazu 125 + 126) auch - und falls einmal doch mehr als eine Zeile zu verarbeiten wäre, wird das mit Deiner Version nicht gehen ...

Grüße
bastla
ColdZero89
ColdZero89 17.10.2012 aktualisiert um 16:34:10 Uhr
Goto Top
Moin,

AHHHHHHHHH nun weiß ich was du meinst.
Bisher hat aber alles sauber geklappt. Auch mit 2 Datein wunderbar. Ohne Fehlermeldung pickt er sich das richtige Datum raus und packts in die neue Datei.

Das Problem ist nur wenn ich das mache wie du sagst, zickt der aus mir nicht erdenklichen Gründen rum.
Ich teste das nochmal.

EDIT:
Okay... nun bin ich stark verwirrt. Vorhin zickte er dann beim Programm Ende NUR rum, nun macht er alles sauber und ordentlich zu ende. Hmpf. Aber ich verstehe zumindestens jetzt deinen Einwand wieso das so sein muss. Script ist auch angepasst

Dennoch ne Idee wie man dem sagt pack das net untereinander sondern hintereinander in die Datei? Bin am Forsten und finde nix...

Gruß Zero

EDIT Nun wollt ich die "Ein"-Variable auf das Netzlaufwerk erweitern. Da dies bis zu dem Ordner "Anlagendaten" geht und danach noch das Jahr, sowie der Monat dann folgt wollte ich das mit Platzhaltern gestalten... funktioniert nur nicht.

set "Ein=PFAD\Anlagendaten\*\*  

Die CSV wird ja beim aufrufen dann hinzugefügt. Ich wollte erreichen das er alle CSV-Datein durchsucht.
Für PVU1 war ich dann gedanklich soweit das in der Variable "Ein" am ende noch ein "\*PVU1.csv" steht. FUnktioniert auch nicht.

Wie würde das mit 2 weiteren Unterordnern und Platzhaltern funktionieren? Auch schon % ausprobiert, funktioniert auch nicht. Auch *.* probiert, geht auch nicht. Ich verzweifle!!! Grml.
bastla
bastla 17.10.2012 um 18:13:46 Uhr
Goto Top
Hallo ColdZero89!

Wenn es mehrere Dateien in mehreren Unterordnern sind, kannst Du die nur in einer Schleife erwischen - etwa:
set "Ein=PFAD\Anlagendaten\*PVU1.csv"  
for /f "delims=" %%d in ('dir /s/b/a-d "%Ein%"') do (  
    for /f "delims=" %%i in ('findstr "%Zeit%" "%%d"^|findstr "%Datum%"') do (   
        set "ZeileEin=%%i"   
        set "ZeileEin=!ZeileEin:,=@!"   
        call :ProcessLineSAA2 !ZeileEin:;= !
    )
) 
set AW=0
GOTO :menu
Was ich noch immer nicht verstanden habe, ist was Du mit
pack das net untereinander sondern hintereinander in die Datei?
meinst. Sollen da Werte aus mehreren Dateien in einer Zeile landen?

Grüße
bastla
ColdZero89
ColdZero89 18.10.2012 aktualisiert um 12:40:19 Uhr
Goto Top
Moin,

JAA das ist am treffensten beschrieben face-big-smile
Werte aus mehreren Dateien sollen nicht untereinander sondern nebeneinander und es soll auch nur einmal das Datum kopiert werden.
Herrjeh - ich fummel mich um ne beschreibung und du bringst es in einem Satz auf ne Punktlandung face-smile

Aber genau das meinte ich. Es sind ingesamt 7 Datein.

Gruß Zero

EDIT
Habe gerade deinen vorschlag mit den Unterordnern eingesetzt.
Ich bekomme daraufhin folgende fehlermeldung: Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch.
Die komplette Zeile sieht wie folgt aus:
set "Ein=N:\XXXXXXX XXXXXXXX\XXX XXX XXXXXX XXXXXXXXXXXXXXXX\XXXX   XX\XX XXXXXXXXXXXX\XXXXXXXXXXXXXXXXXX XXXXXXX XXXXXXXXXXX\XXXXXXXX XXXXXXXXXXXXX XXXXX SAA2+3\Anlagendaten\*\*\*_PVU1.csv"  
Hab mal alles ersetzt um einfach keine Internen Daten oder sonstwas rauszugeben - nicht das es noch mecker gibt ^-^
Ich weiß, viele Leerzeichen und alles. Ich schüttel auch den kopf.

An sich ist es aber schon ein anderer Fehler als vorher.
Einheitlich ist das vor jeder Datei das Datum steht in der Form: 20120930 - sollte ich dann anstatt * lieber ???????? nutzen?

EDIT2
So nun habe ich einfach mal testweise Variablen anstelle von den * genutzt. einmal das Jahr und einmal den Monat. Ich gebe diese vorher ein. Der Fehler der nun kommt, wundert mich noch mehr denn durch ein Echo lass ich mir den einmal ausgeben und dieser stimmt...
Fehler lautet nun: Das System kann den angegebenen Pfad nicht finden.
Zeile:
set "Ein=N:\xxxxxxx xxxxxxxx\xxx xxx xxxxxx xxxxxxxxxxxxxxxx\xxxx   xx\xx xxxxxxxxxxxx\xxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxxxxxx\xxxxxxxx xxxxxxxxxxxxx xxxxx xxxxxx\Anlagendaten\%Jahr%\%Monat%\*_PVU1.csv"  
Das Jahr ist immer im Normalen Format: JJJJ
Der Monat ist in folgendem Format vorzufinden: 09_September

Dennoch sagt er nun: Er kann den Pfad nicht finden... wenn ich den Pfad aus der CMD kopieren und in den Explorer eingebe komm ich GENAU in den Ordner....
Ist ihm der Pfad zu lang...?

EDIT3
Damit das Programm nicht zuviele Ordner durchsuchen muss habe ich den Pfad um den Jahresordner erweitert.
Mit dem Befehl
FOR /f "tokens=1-3 delims=. " %%G IN ('echo %Datum%') DO set Jahr=%%I  
Extrahiere ich aus dem eingegeben Datum das Jahr und füge dies anstelle des ersten * in den Pfad ein. Wie in Edit 2 zu sehen ist nun nur noch der Monat durch ein * gesetzt. Das Jahr steht nun.
Abhilfe schafft dies trotzdem nicht... sollte aber - wenn es funktioniert - die Laufzeit verkürzen.
bastla
bastla 22.10.2012 aktualisiert um 12:14:02 Uhr
Goto Top
Hallo ColdZero89!

Mit ein klein wenig face-wink Verspätung mal kurz zum Thema "Finden der Dateien": Wildcards (* oder ?) dürfen nur im letzten Pfadbestandteil verwendet werden - wenn also das Jahr bekannt ist, sollte
set "Ein=N:\xxxxxxx xxxxxxxx\xxx xxx xxxxxx xxxxxxxxxxxxxxxx\xxxx   xx\xx xxxxxxxxxxxx\xxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxxxxxx\xxxxxxxx xxxxxxxxxxxxx xxxxx xxxxxx\Anlagendaten\%Jahr%\*_PVU1.csv"
alle im "Jahr"-Ordner selbst und alle in irgendeinem Unterordner davon (es wird dann ja "/s/b" verwendet) liegenden CSV-Dateien, deren Name auf "_PVU1" endet, liefern - und nein, mit weniger als 200 Zeichen ist der Pfad nicht zu lang ...

Grüße
bastla
ColdZero89
ColdZero89 23.10.2012 aktualisiert um 11:41:35 Uhr
Goto Top
Moin Moin ausm warmen und doch regnerischem Hamburg,

ja entschuldige das ich so spät antworte. Ich war/bin außer Gefecht gesetzt.

Ja das mit den Zeichen was meine aller erster Vermutung, dieses nachgezählt und passte.

Aber gut, das wusste ich noch nicht. Wo wird denn /s /b verwendet?
Ach beim "dir" face-big-smile Augen auf im Scriptverkehr.

Ok, /s für alle Unterordner. Gleich mal testen. Danke dir.

Gruß Zero

EDIT:
Nun so abgeändert und dennoch passiert genau das: Das System kann den angegebenen Pfad nicht finden.
Grml. Wieso zickt der Rum?
Per Echo das ding aufgerufen bekomme ich den richtigen Pfad mit dem Jahr und co. Wieso macht der das dann nicht?

EDIT2
Nun mal mit der CMD ein wenig gespielt.
Er gibt alles komplett richtig aus. Habe die Variable "Ein" festgelegt und dann den "dir"-Befehl ausgeführt. Funktioniert 1a. Er gibt mir nur noch Dateien mit *_PVU1.csv aus.

Ich frag mich nur wieso er sagt er konnte die Datei nicht finden?
Pro Monat sind dies 4 Dateien von PVU1. auf 12 Monate gerechnet sind wir bei 52 Dateien.
Weigert er sich diese zu Durchsuchen weil es ihm zu viele sind?

Den Monat daraufhin zu Extrahieren und diesen Festzulegen funktioniert nicht, da als Beispiel in der Datei vom 01.10.12 die Werte vom 24-30.September sind. Diese können sich halt überschneiden.
bastla
bastla 23.10.2012 aktualisiert um 12:51:33 Uhr
Goto Top
Hallo ColdZero89!
Er gibt alles komplett richtig aus.
Das ist ja schon mal schön ... face-smile

Du könntest versuchen, den Ablauf direkt in der CMD-Shell weiter zu testen, indem Du den ausgegebenen Pfad in
for /f "delims=" %i in ('findstr "%Zeit%" "HIER_DER_PFAD"^|findstr "%Datum%"') do echo "%i"
einsetzt oder sogar nur mal den "findstr"-Teil ausführst (dann natürlich ohne "^") ...

Auch ein einfaches
dir "HIER_DER_PFAD"
könnte schon mal Anhaltspunkte liefern ...

Grüße
bastla
ColdZero89
ColdZero89 23.10.2012 um 13:23:50 Uhr
Goto Top
Moinsen,

for /f "delims=" %i in ('findstr "%Zeit%"
> "HIER_DER_PFAD"^|findstr "%Datum%"') do echo "%i"
> 

Hab vorher Ein, Datum, Jahr, Zeit gesetzt jeweils mit set xxx=yyyy und geprüft mit echo.

Befehl wie folgt in 2 Varianten ausgeführt
for /f "delims=" %i in ('findstr "%Zeit%" "%Ein%"^|findstr "%Datum%"') do echo "%i"  
for /f "delims=" %i in ('findstr "%Zeit%" "KOMPLETTER PFAD"^|findstr "%Datum%"') do echo "%i"  

FINDSTR: N:\PFAD\Anlagendaten\2012\*_PVU1.csv kann nicht geöffnet werden.

Auch ein einfaches
dir "HIER_DER_PFAD"
> 
könnte schon mal Anhaltspunkte liefern ...

Da kapier ich nicht was du möchtest, habs nun so gemacht wie ich verstanden, weiß nur nicht was sinn ist.
Habe nun
dir N:\PFAD\Anlagendaten\2012\*_PVU1.csv
eingegeben und ergebnis ist dies

Das System kann die angegebene Datei nicht finden.

Ich dreh bald noch durch und fress den Code!

Gruß Zero
bastla
bastla 23.10.2012 um 16:05:41 Uhr
Goto Top
Hallo ColdZero89!

Mit HIER_DER_PFAD ist natürlich einer der "komplett richtig ausgegebenen" Pfade gemeint - also etwas wie
N:\XXXXXXX XXXXXXXX\XXX XXX XXXXXX XXXXXXXXXXXXXXXX\XXXX   XX\XX XXXXXXXXXXXX\XXXXXXXXXXXXXXXXXX XXXXXXX XXXXXXXXXXX\XXXXXXXX XXXXXXXXXXXXX XXXXX SAA2+3\Anlagendaten\2012\09_September\IRGENDWAS_PVU1.csv"
Grüße
bastla
ColdZero89
ColdZero89 24.10.2012 aktualisiert um 11:58:20 Uhr
Goto Top
Moinsen,

ah du meinst also eine Explizite Datei angeben. Ok.

Was mir spontan eingefallen ist:

Da der "Suchlauf" Nach den Dateien ja scheinbar reibungslos funktioniert, würde das ganze eventuell so funktionieren, dass das Script alle gefundenen Dateien in ne txt schreibt, diese eingelesen wird und jede einzelne Zeile dann aus der txt abgearbeitet wird. Dort steht dann der vollständige Pfad wir du ihn oben genannt hast.

Ich teste das gleich mal.

Gruß Zero

Edit:

Also mit komplettem Pfad + Dateiname vorgegeben bekomme ich dieses ergebnis, wenn ich nach dem 28.09.2012 23:50 suchen lasse in der Datei 10_Oktober\20121001_PVU1.csv
(Wieder in nen Code da sonst alles abgeschnitten wird, dran denken es gibt genau 2 mal diese Werte in der Tabelle)
d:\kela>echo "28.09.2012 23:50:00;2,71;0,00;0,00;-3,10;0,00;3276,70;0,00;3,80;3122608,00;0,00;0,00;0,00;0,13;0,00;0,00;0,00;415717,00;28,00;45389,00;45389,00;0,00;0,00;0,00;5000,00;1733,10;225,78;226,75;226,77;3,27;3178571,00;0,00;0,00;0,00;0,13;0,0  
0;0,00;0,00;426956,00;30,00;45104,00;45104,00;0,00;0,00;0,00;5000,00;1682,80;224,83;226,82;226,82;8,50;3202637,00;0,00;0,00;0,00;0,10;0,00;0,00;0,00;433320,00;28,00;46973,00;46973,00;0,00;0,00;0,00;5000,00;1807,60;227,18;226,85;226,65;0,00;2878106,00;0,00
;0,00;0,00;0,20;0,00;0,00;0,00;375593,00;25,00;36704,00;36704,00;0,00;0,00;0,00;5000,00;933,70;226,90;225,92;226,37;1,58"  
"28.09.2012 23:50:00;2,71;0,00;0,00;-3,10;0,00;3276,70;0,00;3,80;3122608,00;0,00;0,00;0,00;0,13;0,00;0,00;0,00;415717,00;28,00;45389,00;45389,00;0,00;0,00;0,00;5000,00;1733,10;225,78;226,75;226,77;3,27;3178571,00;0,00;0,00;0,00;0,13;0,00;0,00;0,00;426956,  
00;30,00;45104,00;45104,00;0,00;0,00;0,00;5000,00;1682,80;224,83;226,82;226,82;8,50;3202637,00;0,00;0,00;0,00;0,10;0,00;0,00;0,00;433320,00;28,00;46973,00;46973,00;0,00;0,00;0,00;5000,00;1807,60;227,18;226,85;226,65;0,00;2878106,00;0,00;0,00;0,00;0,20;0,0
0;0,00;0,00;375593,00;25,00;36704,00;36704,00;0,00;0,00;0,00;5000,00;933,70;226,90;225,92;226,37;1,58"  

Da das Ergebnis mit komplettem Dateipfad und expliziter angabe scheinbar funktioniert - gehe ich der vermutung doch sehr stark nach dass das Schreiben des Suchergebnisses nach PVU1.csv Dateien in ne TXT und diese einzulesen und abzuarbeiten sinnvoll, effektiv und funktionieren sollte oder? face-big-smile

EDIT2:

Bin ich zu dämlich? Ich kapier net wieso er diese PIEP nicht einfach richtig macht -.-

Ich schreibe
for /f "delims=" %%d in ('dir /s/b/a-d "%Ein%"') do (   
echo "%%d" >> "%Datei%"   
)
(Habs auch als Einzeiler gehabt, funktionierte auch net)

Datei wird vorher deklariert und auch einmal erzeugt - sowie am programmende gelöscht.
Nun soll diese schleife die Suchergebnisse in die Datei schreiben. In der CMD funktioniert das wunderschön als einzeiler... nur irgendwie net ganz in dem Konstrukt.

Einegsetzt wird diese Schleife bei :umwandelnSAA2 BEVOR die Schleife mit der Processline abegrufen wird.

Folgend habe ich dann ein einfaches:
for /f %%h in ("%Datei%") do echo %%h  
Da ich den Inhalt sehen wollte...

Danach kommt dann die normale Schleife die dann in die Processline hüpft. Dort sieht der Anfang der Schleife nun wie folgt aus:
for /f "delims=" %%i in ('findstr "%Zeit%" "%Datei%"^|findstr "%Datum%"') do (   

Wenn ich das ausführe bekomme ich folgende Fehlermeldung:
Das System kann den angegebenen Pfad nicht finden.
D:\Users\kela\Documents\hans1.txt

Ich dreh noch durch. Eigentlich muss er doch aus der einen For schleife, die nächste mir den kompletten inhalt aus der Variablen "Datei" anzeigen und danach den ganzen schnodder normal ausführen wie bisher nur das er diesmal einen kompletten vollständigen und sauberen schönen Pfad hat!
Was mir grad auffällt: der schreibt nichtmal IRGENDWAS in die "hans1.txt" -.- ich kotzt gleich ne tüte voll!
bastla
bastla 24.10.2012 um 11:51:29 Uhr
Goto Top
Hallo ColdZero89!

Eigentlich sollte es (außer hinsichtlich der Eleganz face-wink) keinen Unterschied machen, ob Du ein "%%i" zuerst in eine Datei schreibst und danach aus der Datei wieder ausliest oder es gleich direkt weiter verarbeitest - aber wenn's funktioniert ... face-smile

Grüße
bastla
ColdZero89
ColdZero89 24.10.2012 aktualisiert um 14:41:24 Uhr
Goto Top
Moin bastla,

ja ich will ja nichts unversucht lassen, theorie und praxis... hach das sind immer so 2 dinge ^-^ theoretisch kann ich fliegen, praktisch nicht so wirklich face-big-smile

siehe Post über dir Edit2, dort hab ich grad weiter geschrieben ^^

Gruß Zero

EDIT:
Nun habe ich gerade per CMD die hans1.txt erstellt mit Inhalt. Was mir dabei auffällt es wird der Pfad in " reingeschrieben... Wenn ich den 1 zu 1 da rauskopiere bekomm ich ein Problem, der kann den Pfad nicht aufrufen.

Durch die zweite Schleife ruft er also tatsächlich das komplette ding mit den " auf und sucht den Pfad...

Mich beschleicht so ein leichtes Zirpen im Kopf, das genau DORT der Fehler steckt. Er übergibt die " mit und dann kann er natürlich rein gar nichts finden.

Ich Probier mal rum WO die da hinzugeschmissen werden.

Zusatz: Okay beim echo hat er die kompletten " Mitgenommen - hät mir auch klar sein müssen. Selbst ohne die " nun, gibt er mir diese hans1.txt aus %%h aus und eben NICHT einen Pfad zu einer der CSV Dateien... Potzblitz wieso?!
ColdZero89
ColdZero89 29.10.2012 um 11:59:29 Uhr
Goto Top
Moin,

einer noch ne Idee wieso er das nicht macht? Wenn die ganzen Dateien in einem Ordner liegen macht er das Wunderbar. Sobald es darum geht auch in Unterordner zu gehen, streickt er.

Mir kommt grad noch ne Idee. Ich lasse ihn alle Dateien suchen, und kopiere diese einfach in einen temporären Ordner und beim Programmende löscht er diesen einfach wieder.

Das teste ich die Tage nochmal, da momentan viel zu tun ist.

Gruß Zero
ColdZero89
ColdZero89 29.10.2012 um 14:44:01 Uhr
Goto Top
Moin,

ich bin am rande der Verzweiflung...
per CMD ausgeführte Zeile zum suchen der Dateien auf dem Netzlaufwerk, hier anzumerken das ich wie im Script die Variablen vorher deklariere, die Zeile wird also tatsächlich IDENTISCH wie die im Script aufgerufen => Funktion 1a
per Script IDENTISCH ausgeführte Zeile zum suchen der Dateien auf dem Netzlaufwerk => Kann Pfad nicht finden

Das ist doch zum Mäuse schlachten.

Hab nun auch den einen Ordner (2012) Ebene für Ebene vorkopiert ob es dort funktioniert. Fehlanzeige, genau der selbe mist.

Echt keiner mehr ne Idee wieso es in der CMD aber nicht im Script geht? Kann doch nicht sein das Microsoft da so rumzickt bzw unterschiede macht.
Gibt es ne Option um Scriptgesteuerten Zugriff auf Server zu verbieten?

Gruß Zero
bastla
bastla 29.10.2012 aktualisiert um 14:52:00 Uhr
Goto Top
Hallo ColdZero89!
Gibt es ne Option um Scriptgesteuerten Zugriff auf Server zu verbieten?
Wäre mir neu ...

Hast du auch mit einem UNC-Pfad getestet?

Grüße
bastla
rubberman
rubberman 29.10.2012 um 21:58:48 Uhr
Goto Top
Hallo ColdZero89.

Also ein paar Unterschiede zwischen Kommandozeile und Batch gibt es schon. Die meisten beziehen sich auf die unterschiedliche Verarbeitung von Prozentzeichen. Beispiele:
- nicht existierende Argumente (%1) expandieren in der Kommandozeile zum Literal %1, im Batch zu nix
- nicht definierte Variablen (%leer%) expandieren in der Kommandozeile zum Literal %leer%, im Batch zu nix
- wenn Prozentzeichen als literaler Ausdruck geparst werden sollen, müssen sie im Batch verdoppelt werden
- FOR Variablen in der Kommandozeile mit einem Prozentzeichen, im Batch mit 2 Prozentzeichen

Ob das nun die Ursache für dein Problem ist, weiß ich nicht. Wie sieht denn die Zeile aus, mit der du testest?

Grüße
rubberman
ColdZero89
ColdZero89 30.10.2012 um 08:59:43 Uhr
Goto Top
Moin,

erstmal danke für die Infos.

Ich hab nen kleinen Erfolg verbuchen können, unser nagetier brachte mich drauf.

Ich hab den Pfad direkt bis in den Zielordner (Anlagendaten) als neues Netzlaufwerk hinzugefügt.
Funktion des batch? Einwandfrei aufeinmal wenn ich direkt über das neue Netzlaufwerk gehe.
(Nen Problem das die Batch dann alle CSV Dateien durchsucht auch wenn es den Wert schon gefunden hat muss ich noch lösen)

Will ich aber nun per Batch und Net use das Netzlaufwerk verbinden: MÖÖÖP Systemfehler 53 ist aufgetreten

Für dieses Problem such ich mich seit gestern im Inet ab....

Gruß Zero
bastla
bastla 30.10.2012, aktualisiert am 31.10.2012 um 09:31:55 Uhr
Goto Top
Hallo ColdZero89!

Um mich zu wiederholen: Wie sieht's denn bei Verwendung des UNC-Pfades aus? Und: Kommt im Pfad ein %-Zeichen vor (denn dann müsstest du das - siehe rubbermans Hinweis - im Batch verdoppeln)?

Grüße
bastla
ColdZero89
ColdZero89 31.10.2012 aktualisiert um 12:04:14 Uhr
Goto Top
Moin,

Ja klar im pfad kommt ein % vor. Im Script ist das verdoppelt, in der CMD nur einfach.
Das Script interpretiert das doppelte % doch als einfaches % oder nicht?

Den UNC Pfad teste ich heut mal fix. Daran gar nicht mehr gedacht.

Gruß Zero

EDIT: So UNC Pfad getestet, funktioniert auch nicht. Im Explorer eingegeben funktioniert dieser einwandfrei.
Bleibt nur die Lösung mit dem Netzlaufwerk auf den Ordner einrichten.
Problem dann: Der durchsucht jede einzelne Datei - auch wenn er die Werte gefunden hat. Dort werd ich tricksen müssen das er nur einen Monat davor und einen danach sucht. Wenn es ein nen Januar ist muss das jahr für Dezember auch -1 Gerechnet werden, für Dezember in den Januar +1, wird ein wenig frickelig aber da hab ich nen plan.
Eventuell umständlich - aber es wird funktionieren face-big-smile ich seh bastla schon den Kopf schütteln.

Edit2: zu den %

Im Pfad kommt ein % vor aber nur in Verbindung mit ner Variablen: set "Ein=Z:\%Jahr%\*_PVU2.csv" (das ist nun der kurze Pfad)
So funktioniert dies aber einwandfrei, es wird ja nur die Variable aufgerufen und soweit ich weiß mussten da NIE zwei % hin, eins reichte.
Ansonsten kommen im Pfad folgende zeichen vor:
( ) , +

Wenn ich den Pfad mit einem Echo ausgeben lasse im Script war der jedesmal vollständig und richtig, oder trügt das?
ColdZero89
ColdZero89 15.02.2013 um 15:43:59 Uhr
Goto Top
Moin,

da hierzu nichts mehr kam und das Problem nun anders gelöst ist, schließe ich das thema.

Gruß Zero