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.
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
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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
52 Kommentare
Neuester Kommentar
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:
Die Schreibweise mit benannten Argumenten (zB "
Deklarationen per "
Der mit dem Makro-Recorder aufgezeichnete Code arbeitet (erklärlicher Weise) mit vielen "
machen oder das auch gleich umarbeiten in
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 "
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
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 ausCells(Suchbereich, 1).Select
Selection.Offset(1, 1).Select
Cells(Suchbereich, 1).Offset(1, 1).Select
Range(Cells(Suchbereich + 1, 2), Cells((Suchbereich + 1 + (WRAnzahl - 1)), 2)).Copy
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 ...
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'
Bei mehreren Such-Parametern, empfielt sich die AutoFilter-Funktion zu nutzen... Da musst Du nix suchen, sonderen nur das Filter-Ergebnis kopieren.
Gruß Dieter
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
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
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
Hallo Zero!
Diese Codezeile hat mit dem Suchergebnis nix zu tun
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
Diese Codezeile hat mit dem Suchergebnis nix zu tun
>> "%S%" echo Wkb1.Close False
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
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:
Gruß Dieter
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
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
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
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
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
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 "
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 "
Grüße
bastla
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 fr 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
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
Hallo ColdZero89!
Grüße
bastla
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?das Gerüst aus Batch drum herum
Grüße
bastla
Hallo ColdZero89!
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
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 (
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
Hallo ColdZero89!
Ein Test direkt in der CMD-Shell sähe etwa so aus:
Wegen des "
Nur zur Sicherheit: Deine ursprünglichen Zeilen 10 bis 13 brauchst Du natürlich weiterhin.
müsste übrigens ebenfalls funktionieren ...
Grüße
bastla
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
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
>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
Grüße
bastla
Hallo ColdZero89!
Die Zeile 88 sollte so aussehen:
und die bisherigen Zeilen 87 und 88 gehören in Zeile 74 ...
Grüße
bastla
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
Grüße
bastla
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 "
Grüße
bastla
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
Hallo ColdZero89!
Wenn es mehrere Dateien in mehreren Unterordnern sind, kannst Du die nur in einer Schleife erwischen - etwa:
Was ich noch immer nicht verstanden habe, ist was Du mit
Grüße
bastla
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
pack das net untereinander sondern hintereinander in die Datei?
meinst. Sollen da Werte aus mehreren Dateien in einer Zeile landen?Grüße
bastla
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
alle im "Jahr"-Ordner selbst und alle in irgendeinem Unterordner davon (es wird dann ja "
Grüße
bastla
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"
/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
Hallo ColdZero89!
Du könntest versuchen, den Ablauf direkt in der CMD-Shell weiter zu testen, indem Du den ausgegebenen Pfad in
einsetzt oder sogar nur mal den "
Auch ein einfaches
könnte schon mal Anhaltspunkte liefern ...
Grüße
bastla
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"
findstr
"-Teil ausführst (dann natürlich ohne "^") ...Auch ein einfaches
dir "HIER_DER_PFAD"
Grüße
bastla
Hallo ColdZero89!
Mit
Grüße
bastla
Mit
HIER_DER_PFAD
ist natürlich einer der "komplett richtig ausgegebenen" Pfade gemeint - also etwas wieN:\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"
bastla
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
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