Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung

Mitglied: ColdZero89

ColdZero89 (Level 1) - Jetzt verbinden

11.10.2012, aktualisiert 12.10.2012, 5267 Aufrufe, 52 Kommentare

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.
01.
Sub Daten_holen() 
02.
Application.ScreenUpdating = False 'Screen off 
03.
'Marko um in der Tagesauslesung nach Parknamen zu suchen um diese zu Kopieren und in die Tabelle einzutragen 
04.
Dim Parknummer As Integer 
05.
Dim Parkname As String 
06.
Dim Suchbereich As Integer 
07.
Dim WRAnzahl As Byte 
08.
'Excel Datei öffnen 
09.
    Workbooks.Open Filename:= _ 
10.
        "PFAD\_tagesauslesung_zählerstände.xls" _ 
11.
    'Deklarierung der Entsprechenden Daten 
12.
    For Parknummer = 1 To 3 'Erste Schleife 
13.
     If Parknummer = 1 Then 
14.
        Parkname = "Bad Kreuznach" 
15.
        WRAnzahl = 9 
16.
     End If 
17.
     If Parknummer = 2 Then 
18.
        Parkname = "Göttelborn" 
19.
        WRAnzahl = 16 
20.
     End If 
21.
     If Parknummer = 3 Then 
22.
        Parkname = "Landau" 
23.
        WRAnzahl = 7 
24.
     End If     
25.
        'Suchlauf nach Parknamen. Kopieren und Einfügen der Daten 
26.
        Workbooks("_tagesauslesung_zählerstände").Activate 
27.
        For Suchbereich = 1 To 300 'Zweite Schleife 
28.
         If Cells(Suchbereich, 1) = Parkname Then 
29.
            Cells(Suchbereich, 1).Select 
30.
            Selection.Offset(1, 1).Select 
31.
            Range(Cells(ActiveCell.Row, 2), Cells((ActiveCell.Row + (WRAnzahl - 1)), 2)).Select 
32.
            Selection.Copy         
33.
            Workbooks("Anlagenabfrage für FlexCtrl + CCC").Activate 
34.
            Sheets("Makro").Select 
35.
            For Copybereich = 1 To 300 'Dritte Schleife 
36.
             If Cells(Copybereich, 1) = Parkname Then 
37.
                Cells(Copybereich, 1).Select 
38.
                Selection.Offset(1, 1).Select 
39.
                Range(Cells(ActiveCell.Row, 2), Cells((ActiveCell.Row + (WRAnzahl - 1)), 2)).Select 
40.
                Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
41.
                    :=False, Transpose:=False 
42.
            Exit For 'Dritte Schleife 
43.
             End If 
44.
            Next 'Dritte Schleife 
45.
             
46.
        Exit For 'Zweite Schleife 
47.
         End If 
48.
        Next 'Zweite Schleife         
49.
    Next 'Erste Schleife 
50.
    'Excel Datei schließen 
51.
    Workbooks("_tagesauslesung_zählerstände").Close 
52.
    Application.ScreenUpdating = True 'Screen on 
53.
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
52 Antworten
Mitglied: bastla
11.10.2012, aktualisiert um 17:36 Uhr
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
01.
Cells(Suchbereich, 1).Select 
02.
Selection.Offset(1, 1).Select
01.
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 ...
Bitte warten ..
Mitglied: ColdZero89
12.10.2012, aktualisiert um 10:48 Uhr
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
Bitte warten ..
Mitglied: ColdZero89
12.10.2012, aktualisiert um 11:39 Uhr
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:

01.
@echo on & setlocal 
02.
 
03.
rem Script zum Auslesen der csv Datein von Saarbrücken 1 
04.
rem V1.0a Suche mit festem Datum nach Monatswerten in Datei von PVU1 
05.
 
06.
set DATUM=30.09.2012 
07.
set ZEIT=23:50 
08.
set DATEI=D:\PFAD\SAARBRUECKEN_TEST\ 
09.
 
10.
rem Abfrage nach gesuchtem Datum 
11.
rem set /p Datum=Bitte Datum im Format TT.MM.JJJJ angeben:  
12.
 
13.
set "S=%temp%\Saarbruecken_Datenauswertung.vbs 
14.
> "%S%" echo Set fso = CreateObject("Scripting.FileSystemObject") 
15.
>> "%S%" echo Set oXL = CreateObject("Excel.Application")  
16.
>> "%S%" echo Const xlCellValue = 1  
17.
>> "%S%" echo Const xlGreater = 5 
18.
>> "%S%" echo For Each oExcelDatei In fso.GetFolder("%DATEI%").Files  
19.
>> "%S%" echo If LCase(fso.GetExtensionName(oExcelDatei.Name)) = "csv" Then  
20.
>> "%S%" echo oXL.Workbooks.Open oExcelDatei.Path  
21.
>> "%S%" echo End If 
22.
>> "%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 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...
Bitte warten ..
Mitglied: 76109
12.10.2012, aktualisiert um 12:01 Uhr
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'

01.
>> "%S%" echo For Each oExcelDatei In fso.GetFolder("%DATEI%").Files 
02.
>> "%S%" echo If LCase(fso.GetExtensionName(oExcelDatei.Name)) = "csv" Then 
03.
>> "%S%" echo Set Wkb1 = oXL.Workbooks.Open(oExcelDatei.Path) 
04.
>> "%S%" echo Set Wks1 = Wkb1.Sheets^(1^) 
05.
>> "%S%" echo 'Mach mit dem 1. Sheet irgendwas 
06.
>> "%S%" echo Wkb1.Close False 
07.
>> "%S%" echo End If 
08.
>> "%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
Bitte warten ..
Mitglied: ColdZero89
12.10.2012, aktualisiert um 14:34 Uhr
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:
01.
@echo off & setlocal 
02.
set "S=%temp%\Saarbruecken_Datenauswertung.vbs 
03.
> "%S%" echo Set fso = CreateObject("Scripting.FileSystemObject") 
04.
>> "%S%" echo Set oXL = CreateObject("Excel.Application")  
05.
>> "%S%" echo Const xlCellValue = 1  
06.
>> "%S%" echo Const xlGreater = 5 
07.
>> "%S%" echo For Each oExcelDatei In fso.GetFolder("%DATEI%").Files  
08.
>> "%S%" echo If LCase(fso.GetExtensionName(oExcelDatei.Name)) = "csv" Then  
09.
>> "%S%" echo set Wkb1 = oXL.Workbooks.Open(oExcelDatei.Path) 
10.
>> "%S%" echo Set Wks1 = Wkb1.Sheets^(1^)  
11.
>> "%S%" echo For Suchbereich = 1 to 15000 
12.
>> "%S%" echo If Cells (Suchbereich, 1) = "%DATUM% %ZEIT%" then 
13.
>> "%S%" echo echo Wkb1.Close False  
14.
>> "%S%" echo End If 
15.
>> "%S%" echo Next 
16.
 
17.
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

Gruß Zero
Bitte warten ..
Mitglied: 76109
12.10.2012 um 14:51 Uhr
Hallo Zero!

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

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
Bitte warten ..
Mitglied: ColdZero89
12.10.2012, aktualisiert um 15:21 Uhr
Moin,

und danke das hab ich gar net gesehen 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 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
Bitte warten ..
Mitglied: 76109
12.10.2012, aktualisiert um 15:33 Uhr
Hallo Zero!

Diese Codezeile hat mit dem Suchergebnis nix zu tun
01.
>> "%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 war

Für die AutoFilter-Funktion brauchst keine Strg-Taste. Das Ding heißt AutoFilter und läßt sich auch über AutoFilter im Code ansprechen. 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
Bitte warten ..
Mitglied: ColdZero89
12.10.2012, aktualisiert um 15:53 Uhr
Moin,

also einmal danke - habs grad umgestellt, stimmt ist logisch

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
Bitte warten ..
Mitglied: 76109
12.10.2012 um 18:38 Uhr
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:
01.
    TestZeit = "30.09.2012 23:50" 
02.
     
03.
    If IsDate(TestZeit) Then 
04.
     
05.
        FoundLine = 0 
06.
         
07.
        For Each Cell In WksE.Range("A:A") 
08.
            If Cell.Text = "" Then 
09.
                Exit For 
10.
            ElseIf Left(Cell.Text, 16) = TestZeit Then  'Mit Left Sekunden abschneiden 
11.
                FoundLine = Cell.Row:  Exit For 
12.
            End If 
13.
        Next 
14.
         
15.
        If FoundLine > 0 Then 
16.
            'Mach was 
17.
        End If 
18.
     
19.
End If 
20.
 
Gruß Dieter
Bitte warten ..
Mitglied: bastla
12.10.2012, aktualisiert um 21:00 Uhr
Hallo ColdZero89!

Würdest Du Dich da nicht "durchbeißen" wollen (und wärst inzwischen zusammen mit Dieter noch nicht soweit damit gekommen ), 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
Bitte warten ..
Mitglied: 76109
13.10.2012 um 15:36 Uhr
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 wollen

Gruß Dieter
Bitte warten ..
Mitglied: ColdZero89
15.10.2012, aktualisiert um 09:26 Uhr
Moinsen meine lieben

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? 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
Bitte warten ..
Mitglied: bastla
15.10.2012 um 13:16 Uhr
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
Bitte warten ..
Mitglied: ColdZero89
15.10.2012, aktualisiert um 13:24 Uhr
Moin,

ok nun einmal im Editor geöffnet. Hier die Zeile mit den Überschriften und dann der Werte.
01.
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 
02.
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
Bitte warten ..
Mitglied: bastla
15.10.2012, aktualisiert um 13:54 Uhr
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:
01.
@echo off & setlocal enabledelayedexpansion 
02.
set "Ein=PFAD\_tagesauslesung_z„hlerst„nde.xls" 
03.
set "Aus=PFAD\Anlagenabfrage fr FlexCtrl + CCC.csv" 
04.
 
05.
set "Zeit=23:50" 
06.
set /p "Datum=Bitte Datum im Format TT.MM.JJJJ eingeben:  
07.
 
08.
del "%Aus%" 2>nul 
09.
for /f "delims=" %%i in ('findstr "%Zeit%" "%Ein%"^|findstr "%Datum%"') do ( 
10.
    set "ZeileEin=%%i" 
11.
    set "ZeileEin=!ZeileEin:,=@!" 
12.
    call :ProcessLine !ZeileEin:;= ! 
13.
14.
goto :eof 
15.
 
16.
:ProcessLine 
17.
set "ZeileAus=%Datum% %Zeit%" 
18.
for /l %%a in (1,1,20) do shift 
19.
set "ZeileAus=%ZeileAus%;%1" 
20.
for /l %%a in (1,1,21) do shift 
21.
set "ZeileAus=%ZeileAus%;%1" 
22.
for /l %%a in (1,1,21) do shift 
23.
set "ZeileAus=%ZeileAus%;%1" 
24.
for /l %%a in (1,1,21) do shift 
25.
set "ZeileAus=%ZeileAus%;%1" 
26.
>>"%Aus%" echo %ZeileAus:@=,% 
27.
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
Bitte warten ..
Mitglied: ColdZero89
15.10.2012 um 14:40 Uhr
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
Bitte warten ..
Mitglied: bastla
15.10.2012, aktualisiert um 15:08 Uhr
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?
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
Bitte warten ..
Mitglied: ColdZero89
15.10.2012 um 15:14 Uhr
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
Bitte warten ..
Mitglied: bastla
15.10.2012 um 16:04 Uhr
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
Bitte warten ..
Mitglied: ColdZero89
15.10.2012 um 16:44 Uhr
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
Bitte warten ..
Mitglied: bastla
15.10.2012 um 16:47 Uhr
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
Bitte warten ..
Mitglied: ColdZero89
16.10.2012, aktualisiert um 11:12 Uhr
Guten Morgen liebe Sorgen
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?

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?
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.
Bitte warten ..
Mitglied: ColdZero89
16.10.2012, aktualisiert um 11:52 Uhr
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?

01.
@echo off & setlocal enabledelayedexpansion 
02.
 
03.
set AW=0 
04.
set "Zeit=23:50" 
05.
 
06.
:datum 
07.
set /p "Datum=Bitte Datum im Format TT.MM.JJJJ eingeben:  
08.
 
09.
if %Datum% NEQ ??.??.???? ( 
10.
	echo ======================================================= 
11.
	echo Fehler! Datum muss im Format TT.MM.JJJJ eingegeben werden. 
12.
	echo ======================================================= 
13.
	GOTO :datum 
14.
15.
	 
16.
:menu 
17.
echo Bitte Auswahl der Anlage treffen 
18.
echo [1] Saarbrücken 1 
19.
echo [2] Saarbrücken 2 PVU1 
20.
echo [3] Saarbrücken 2 PVU2 
21.
echo [4] Programmende 
22.
set /p AW=Bitte Auswahlnummer eingeben:  
23.
 
24.
If %AW%==0 ( 
25.
	echo ======================================================= 
26.
	echo Fehler! Auswahl muss eine Zahl von 1-4 sein. 
27.
	echo ======================================================= 
28.
	GOTO :menu 
29.
30.
	 
31.
GOTO CASE_%AW% 
32.
	:CASE_1 
33.
		echo ======================================================= 
34.
		echo Programm für Saarbrücken 1 wird ausgeführt 
35.
		echo ======================================================= 
36.
	GOTO SAA1 
37.
	:CASE_2 
38.
		echo ======================================================= 
39.
		echo Programm für Saarbrücken 2 PVU1 wird ausgeführt 
40.
		echo ======================================================= 
41.
	GOTO SAA2PVU1 
42.
	:CASE_3 
43.
		echo ======================================================= 
44.
		echo Programm für Saarbrücken 2 PVU2 wird ausgeführt 
45.
		echo ======================================================= 
46.
	GOTO SAA2PVU2 
47.
	:CASE_4 
48.
	GOTO eof 
49.
 
50.
:SAA2PVU1 
51.
set "Ein=PFAD\" 
52.
set "Aus=PFAD\Monat_PVU1.csv" 
53.
GOTO Umwandeln 
54.
 
55.
:SAA2PVU2 
56.
set "Ein=PFAD\" 
57.
set "Aus=PFAD\Monat_PVU2.csv" 
58.
GOTO Umwandeln 
59.
 
60.
:Umwandeln 
61.
for /f "delims=" %%i in ('findstr "%Zeit%" "%Ein%\*.csv"^|findstr "%Datum%"') do ( 
62.
    set "ZeileEin=%%i" 
63.
    set "ZeileEin=!ZeileEin:,=@!" 
64.
    call :ProcessLine !ZeileEin:;= ! 
65.
66.
echo Fehler bei der Ausführung 
67.
GOTO :menu 
68.
 
69.
:ProcessLine 
70.
set "ZeileAus=%Datum% %Zeit%" 
71.
for /l %%a in (1,1,20) do shift 
72.
set "ZeileAus=%ZeileAus%;%1" 
73.
for /l %%a in (1,1,21) do shift 
74.
set "ZeileAus=%ZeileAus%;%1" 
75.
for /l %%a in (1,1,21) do shift 
76.
set "ZeileAus=%ZeileAus%;%1" 
77.
for /l %%a in (1,1,21) do shift 
78.
set "ZeileAus=%ZeileAus%;%1" 
79.
>>"%Aus%" echo %ZeileAus:@=,% 
80.
set AW=0 
81.
GOTO :menu 
82.
:eof
Gruß Zero
Bitte warten ..
Mitglied: bastla
16.10.2012 um 12:33 Uhr
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
Bitte warten ..
Mitglied: ColdZero89
16.10.2012, aktualisiert um 12:55 Uhr
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

Manchmal frag ich mich wo mein hirn is

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?
Bitte warten ..
Mitglied: bastla
16.10.2012 um 15:53 Uhr
Hallo ColdZero89!
Bin ich grad nur begriffsstutzig oder hab ich was übersehen?
Kannst eigentlich nur Du beantworten ...

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 
 
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 
 
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 
 
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
Bitte warten ..
Mitglied: ColdZero89
17.10.2012 um 09:40 Uhr
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!

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

Teste das direkt mal Danke bastla

Gruß Zero
Bitte warten ..
Mitglied: ColdZero89
17.10.2012, aktualisiert um 10:17 Uhr
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?

01.
@echo off & setlocal enabledelayedexpansion 
02.
 
03.
rem Deklaration von Variablen 
04.
set "AW=0" 
05.
set "Zeit=23:50" 
06.
 
07.
rem Datum wird per Hand eingegeben 
08.
:datum 
09.
set /p "Datum=Bitte Datum im Format TT.MM.JJJJ eingeben:  
10.
 
11.
rem Datum wird auf Format geprüft	 
12.
echo %Datum%|findstr /X "[0-3][0-9]\.[0-1][0-9]\.2[0-9][0-9][0-9]">nul && goto :menu	 
13.
echo ============================= 
14.
echo Fehler! Datum muss im Format TT.MM.JJJJ eingegeben werden. 
15.
echo ============================= 
16.
GOTO :datum	 
17.
	 
18.
rem Auswahlmenü welche Datein behandelt werden sollen	 
19.
:menu 
20.
echo Bitte Auswahl der Anlage treffen 
21.
echo [1] Saarbruecken 1 
22.
echo [2] Saarbruecken 2 PVU1 
23.
echo [3] Saarbruecken 2 PVU2 
24.
echo [4] Programmende 
25.
set /p AW=Bitte Auswahlnummer eingeben:  
26.
 
27.
rem Auswahl wird geprüft, ob Zahl zwischen 1 und 4 liegt 
28.
echo %AW%|findstr /x "[1-4]">nul && goto :wahl 
29.
echo ============================= 
30.
echo Fehler! Auswahl darf nur zwischen 1 und 4 liegen4 
31.
echo ============================= 
32.
GOTO :menu 
33.
 
34.
rem Springt in den ausgewählten Case und danach in den Programmabschnitt 
35.
:wahl 
36.
GOTO CASE_%AW% 
37.
	:CASE_1 
38.
		echo ============================= 
39.
		echo Programm fuer Saarbruecken 1 wird ausgefuehrt 
40.
		echo ============================= 
41.
	GOTO :SAA1 
42.
	:CASE_2 
43.
		echo ============================= 
44.
		echo Programm fuer Saarbruecken 2 PVU1 wird ausgefuehrt 
45.
		echo ============================= 
46.
	GOTO :SAA2PVU1 
47.
	:CASE_3 
48.
		echo ============================= 
49.
		echo Programm fuer Saarbruecken 2 PVU2 wird ausgefuehrt 
50.
		echo ============================= 
51.
	GOTO :SAA2PVU2 
52.
	:CASE_4 
53.
	GOTO :ende 
54.
 
55.
rem Setzen der Variablen für die Verarbeitung der Daten von SAA2PVU1 
56.
:SAA2PVU1 
57.
set "Ein=PFAD\SAA2PVU1\" 
58.
set "Aus=PFAD\Monat_PVU1.csv" 
59.
GOTO Umwandeln 
60.
 
61.
rem Setzen der Variablen für die Verarbeitung der Daten von SAA2PVU2 
62.
:SAA2PVU2 
63.
set "Ein=PFAD\SAA2PVU2\" 
64.
set "Aus=PFAD\Monat_PVU2.csv" 
65.
GOTO :umwandeln 
66.
 
67.
rem Ersetzen von Zeichen 
68.
:umwandeln 
69.
for /f "delims=" %%i in ('findstr "%Zeit%" "%Ein%\*.csv"^|findstr "%Datum%"') do ( 
70.
    set "ZeileEin=%%i" 
71.
    set "ZeileEin=!ZeileEin:,=@!" 
72.
    call :ProcessLine !ZeileEin:;= ! 
73.
74.
 
75.
rem Ausführendes Programm 
76.
:ProcessLine 
77.
set "ZeileAus=%Datum% %Zeit%" 
78.
for /l %%a in (1,1,20) do shift 
79.
set "ZeileAus=%ZeileAus%;%1" 
80.
for /l %%a in (1,1,21) do shift 
81.
set "ZeileAus=%ZeileAus%;%1" 
82.
for /l %%a in (1,1,21) do shift 
83.
set "ZeileAus=%ZeileAus%;%1" 
84.
for /l %%a in (1,1,21) do shift 
85.
set "ZeileAus=%ZeileAus%;%1" 
86.
>>"%Aus%" echo %ZeileAus:@=,% 
87.
set AW=0 
88.
GOTO :menu 
89.
 
90.
rem Programmende 
91.
:ende 
92.
exit
Gruß Zero
Bitte warten ..
Mitglied: bastla
17.10.2012, aktualisiert um 12:23 Uhr
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
Bitte warten ..
Mitglied: ColdZero89
17.10.2012, aktualisiert um 15:16 Uhr
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
Bitte warten ..
Mitglied: ColdZero89
17.10.2012, aktualisiert um 15:55 Uhr
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
01.
@echo off & setlocal enabledelayedexpansion 
02.
 
03.
rem Script zur Verarbeitung der Wochendatein von Saarbrücken/Ensheim 1+2+3 zur extrahierung der Monatswerte. 
04.
rem 1.0 Verarbeitung der Datei 
05.
rem 2.0 Erweiterung des Scriptes durch ein Menü 
06.
rem V2.0 Kevin Lange, 17.10.2012 
07.
 
08.
 
09.
rem Deklaration von Variablen 
10.
set "AW=0" 
11.
set "Zeit=23:50" 
12.
 
13.
rem Programmbegrüßung 
14.
echo Programm zum Verarbeiten der Wochendatein von Saarbruecken 1+2+3 
15.
echo ================== 
16.
 
17.
rem Datum wird per Hand eingegeben 
18.
:datum 
19.
set /p "Datum=Bitte Datum im Format TT.MM.JJJJ eingeben:  
20.
 
21.
rem Datum wird auf Format geprüft	 
22.
echo %Datum%|findstr /X "[0-3][0-9]\.[0-1][0-9]\.2[0-9][0-9][0-9]">nul && goto :menu	 
23.
echo ================== 
24.
echo Fehler! Datum muss im Format TT.MM.JJJJ eingegeben werden. 
25.
echo ================== 
26.
GOTO :datum	 
27.
	 
28.
rem Auswahlmenü welche Datein behandelt werden sollen	 
29.
:menu 
30.
echo Bitte Auswahl der Anlage treffen 
31.
echo [1] Saarbruecken 1 
32.
echo [2] Saarbruecken 2 PVU1 
33.
echo [3] Saarbruecken 2 PVU2 
34.
echo [4] Datum aendern 
35.
echo [5] Programmende 
36.
set /p AW=Bitte Auswahlnummer eingeben:  
37.
 
38.
rem Auswahl wird geprüft, ob Zahl zwischen 1 und 4 liegt 
39.
echo %AW%|findstr /x "[1-5]">nul && goto :wahl 
40.
echo ================== 
41.
echo Fehler! Auswahl darf nur zwischen 1 und 5 liegen 
42.
echo ================== 
43.
GOTO :menu 
44.
 
45.
rem Springt in den ausgewählten Case und danach in den Programmabschnitt 
46.
:wahl 
47.
GOTO CASE_%AW% 
48.
	:CASE_1 
49.
		echo ================== 
50.
		echo Programm fuer Saarbruecken 1 wird ausgefuehrt 
51.
		echo ================== 
52.
	GOTO :SAA1 
53.
	:CASE_2 
54.
		echo ================== 
55.
		echo Programm fuer Saarbruecken 2 PVU1 wird ausgefuehrt 
56.
		echo ================== 
57.
	GOTO :SAA2PVU1 
58.
	:CASE_3 
59.
		echo ================== 
60.
		echo Programm fuer Saarbruecken 2 PVU2 wird ausgefuehrt 
61.
		echo ================== 
62.
	GOTO :SAA2PVU2 
63.
	:CASE_4 
64.
	GOTO :datum 
65.
	:CASE_5 
66.
	GOTO :ende 
67.
 
68.
rem Setzen der Variablen für die Verarbeitung der Daten von SAA1 
69.
:SAA1 
70.
set "Ein=PFAD\SAA1" 
71.
set "Aus=PFAD\Monat_SAA1.csv" 
72.
GOTO :umwandelnSAA1 
73.
 
74.
rem Ersetzen von Zeichen für Saarbrücken 1 
75.
:umwandelnSAA1 
76.
for /f "delims=" %%i in ('findstr "%Zeit%" "%Ein%\*.csv"^|findstr "%Datum%"') do ( 
77.
    set "ZeileEin=%%i" 
78.
    set "ZeileEin=!ZeileEin:,=@!" 
79.
    call :ProcessLineSAA1 !ZeileEin:;= ! 
80.
81.
set AW=0 
82.
GOTO :menu 
83.
 
84.
rem Ausführendes Programm für Saarbrücken 1 
85.
:ProcessLineSAA1 
86.
set "ZeileAus=%Datum% %Zeit%" 
87.
for /l %%a in (1,1,18) do shift 
88.
set "ZeileAus=%ZeileAus%;%1" 
89.
for /l %%a in (1,1,19) do shift 
90.
set "ZeileAus=%ZeileAus%;%1" 
91.
>>"%Aus%" echo %ZeileAus:@=,% 
92.
GOTO :eof 
93.
 
94.
rem Setzen der Variablen für die Verarbeitung der Daten von Saarbrücken 2 PVU1 
95.
:SAA2PVU1 
96.
set "Ein=PFAD\SAA2PVU1" 
97.
set "Aus=PFAD\Monat_SAA2PVU1.csv" 
98.
GOTO :umwandelnSAA2 
99.
 
100.
rem Setzen der Variablen für die Verarbeitung der Daten von Saarbrücken 2 PVU2 
101.
:SAA2PVU2 
102.
set "Ein=PFAD\SAA2PVU2" 
103.
set "Aus=PFAD\Monat_SAA2PVU2.csv" 
104.
GOTO :umwandelnSAA2 
105.
 
106.
rem Ersetzen von Zeichen für Saarbrücken 2 
107.
:umwandelnSAA2 
108.
for /f "delims=" %%i in ('findstr "%Zeit%" "%Ein%\*.csv"^|findstr "%Datum%"') do ( 
109.
    set "ZeileEin=%%i" 
110.
    set "ZeileEin=!ZeileEin:,=@!" 
111.
    call :ProcessLineSAA2 !ZeileEin:;= ! 
112.
113.
set AW=0 
114.
GOTO :menu 
115.
 
116.
rem Ausführendes Programm für Saarbrücken 2 
117.
:ProcessLineSAA2 
118.
set "ZeileAus=%Datum% %Zeit%" 
119.
for /l %%a in (1,1,20) do shift 
120.
set "ZeileAus=%ZeileAus%;%1" 
121.
for /l %%a in (1,1,21) do shift 
122.
set "ZeileAus=%ZeileAus%;%1" 
123.
for /l %%a in (1,1,21) do shift 
124.
set "ZeileAus=%ZeileAus%;%1" 
125.
for /l %%a in (1,1,21) do shift 
126.
set "ZeileAus=%ZeileAus%;%1" 
127.
>>"%Aus%" echo %ZeileAus:@=,% 
128.
GOTO :eof 
129.
 
130.
rem Programmende 
131.
:ende 
132.
exit
Gruß Zero
Bitte warten ..
Mitglied: bastla
17.10.2012 um 15:38 Uhr
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
Bitte warten ..
Mitglied: ColdZero89
17.10.2012, aktualisiert um 16:34 Uhr
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.

01.
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.
Bitte warten ..
Mitglied: bastla
17.10.2012 um 18:13 Uhr
Hallo ColdZero89!

Wenn es mehrere Dateien in mehreren Unterordnern sind, kannst Du die nur in einer Schleife erwischen - etwa:
01.
set "Ein=PFAD\Anlagendaten\*PVU1.csv" 
02.
for /f "delims=" %%d in ('dir /s/b/a-d "%Ein%"') do ( 
03.
    for /f "delims=" %%i in ('findstr "%Zeit%" "%%d"^|findstr "%Datum%"') do (  
04.
        set "ZeileEin=%%i"  
05.
        set "ZeileEin=!ZeileEin:,=@!"  
06.
        call :ProcessLineSAA2 !ZeileEin:;= ! 
07.
08.
)  
09.
set AW=0 
10.
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
Bitte warten ..
Mitglied: ColdZero89
18.10.2012, aktualisiert um 12:40 Uhr
Moin,

JAA das ist am treffensten beschrieben
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

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:
01.
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:
01.
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
01.
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.
Bitte warten ..
Mitglied: bastla
22.10.2012, aktualisiert um 12:14 Uhr
Hallo ColdZero89!

Mit ein klein wenig 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
Bitte warten ..
Mitglied: ColdZero89
23.10.2012, aktualisiert um 11:41 Uhr
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" 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.
Bitte warten ..
Mitglied: bastla
23.10.2012, aktualisiert um 12:51 Uhr
Hallo ColdZero89!
Er gibt alles komplett richtig aus.
Das ist ja schon mal schön ...

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
Bitte warten ..
Mitglied: ColdZero89
23.10.2012 um 13:23 Uhr
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
01.
for /f "delims=" %i in ('findstr "%Zeit%" "%Ein%"^|findstr "%Datum%"') do echo "%i" 
02.
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
01.
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
Bitte warten ..
Mitglied: bastla
23.10.2012 um 16:05 Uhr
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
Bitte warten ..
Mitglied: ColdZero89
24.10.2012, aktualisiert um 11:58 Uhr
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)
01.
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 
02.
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 
03.
;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" 
04.
"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, 
05.
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 
06.
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?

EDIT2:

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

Ich schreibe
01.
for /f "delims=" %%d in ('dir /s/b/a-d "%Ein%"') do (  
02.
echo "%%d" >> "%Datei%"  
03.
)
(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:
01.
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:
01.
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!
Bitte warten ..
Mitglied: bastla
24.10.2012 um 11:51 Uhr
Hallo ColdZero89!

Eigentlich sollte es (außer hinsichtlich der Eleganz ) 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 ...

Grüße
bastla
Bitte warten ..
Mitglied: ColdZero89
24.10.2012, aktualisiert um 14:41 Uhr
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

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?!
Bitte warten ..
Mitglied: ColdZero89
29.10.2012 um 11:59 Uhr
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
Bitte warten ..
Mitglied: ColdZero89
29.10.2012 um 14:44 Uhr
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
Bitte warten ..
Mitglied: bastla
29.10.2012, aktualisiert um 14:52 Uhr
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
Bitte warten ..
Mitglied: rubberman
29.10.2012 um 21:58 Uhr
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
Bitte warten ..
Mitglied: ColdZero89
30.10.2012 um 08:59 Uhr
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
Bitte warten ..
Mitglied: bastla
30.10.2012, aktualisiert 31.10.2012
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
Bitte warten ..
Mitglied: ColdZero89
31.10.2012, aktualisiert um 12:04 Uhr
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 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?
Bitte warten ..
Mitglied: ColdZero89
15.02.2013 um 15:43 Uhr
Moin,

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

Gruß Zero
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst Batch-Skript: Messdaten in Textdatei finden und in eine neue Datei schreiben (5)

Frage von habmalnefrage zum Thema Batch & Shell ...

Batch & Shell
Batch zum bearbeiten mehrerer CSV (2)

Frage von Matzus87 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (22)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...