ha5257
Goto Top

Per Batch Datei die Zahl jede Zell in einer Spalte um 10 verkleinern

Guten Morgen,

ich importiere jeden Tag automatisch eine Lagerbestandsliste(csv Datei) von meinem Lieferant mit einem Batch Datei. Die Batch Datei importiert zuerst die csv Datei von FTP des Lieferanten(mit wget) und im zweiten Schritt importiert die Batch Datei die csv Datei in meiner Datenbank. Die csv Datei hat 2 Spalten: Spalte A ist Artikelnummer, Spalte B ist Lagerbestand.

Ich möchte per Batch die Zahl in jeder Zelle in der Spalte B um 10 verringern. Wie kann man das machen?

Vielen Dank im Voraus.

Content-ID: 324639

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

Ausgedruckt am: 22.11.2024 um 13:11 Uhr

H41mSh1C0R
H41mSh1C0R 23.12.2016 um 11:01:42 Uhr
Goto Top
Peter18
Lösung Peter18 23.12.2016 um 11:04:09 Uhr
Goto Top
Auch Dir einen guten Morgen ha5257,

um die Frage beantworten zu können fehlen ein paar Informationen.

Zunächst einmal in welcher Umgebung läuft Dein Batch? Ist es VBA, z.B.in einer Access Datenbank, eine Scriptsprache oder etwas anderes?

Mit VBA währ das kein Problem.

Grüße von der Nordsee

Peter
ha5257
ha5257 23.12.2016 um 13:16:23 Uhr
Goto Top
Hallo Peter,

die Batch Datei (xxx.bat) wird gestartet von Windows Aufgabeplaner in Windows CMD.

LG

Lifen
Peter18
Peter18 23.12.2016 um 14:14:41 Uhr
Goto Top
Hallo Lifen,

da haben wir beide ein Problem. Seit XP habe ich mit Batch nicht mehr beschäftigt, aber der Link von H41mSh1C0R liefert vielleicht Hinweise ob im Batch vielleicht auch gerechnet werden kann. Beim diagonallesen sah es aber nicht so aus. Vielmehr scheint es, wie zu Dos-Zeiten mit viel Trixerei vebunden zu sein.

Du hast gesagt, die Daten werden in eine Datenbank importiert. Häufig sind auch dort Skriptschprachen implementiert, mit denen man dann auch rechnen und auf Datenspalten zugreifen kann. Mit EXCEL oder ACCESS wär es zum Beispiel kein Problem diese Opperationen durchzuführen. Auch Open Office bietet Möglichkeiten, aber die Programmierung ist dort etwas schwieriger.

Ich könnte Dir auch ein kleines Programm schreiben, mit dem Du die Bestandszahlen umrechnen kannst, aber einen Macro kannst Du jederzeit anpassen wenn es nötig ist. Da Du einen Batch geschrieben hast, sollte es Dir nicht schwer fallen auch einen Makro zu schreiben. Wenn ich weiß um welche Datenbank es geht, kann ich Dir entsprechende Hilfe anbieten.

Grüße von der Nordsee

Peter
H41mSh1C0R
H41mSh1C0R 23.12.2016 um 14:20:42 Uhr
Goto Top
In Batch kannst du auch "rechnen". Ist halt mit jede Menge Schleifen und Sprungmarken verbunden und ist bei weitem nicht so elegant, als wenn man z.B. gleich die Powershell nimmt.

=)
bastla
Lösung bastla 23.12.2016 um 15:52:18 Uhr
Goto Top
@ H41mSh1C0R

Natürlich ist PS eleganter - aber ganz so arg ist es in Batch auch nicht (zumindest solange die Mengen nur ganzzahlige Werte sind):
@echo off & setlocal
set "Ein=D:\CSV_Ein.csv"  
set "Aus=D:\CSV_Aus.csv"  
set "Fehler=D:\Fehler.txt"  
set "Delim=,"  
set "Delta=-10"  

del "%Fehler%" 2>nul  
set /p Kopfzeile=<"%Ein%"  
>"%Aus%" echo %Kopfzeile%  
for /f "usebackq skip=1 tokens=1-2 delims=%Delim%" %%a in ("%Ein%") do (  
    set /a Menge=%%b+%Delta%
    setlocal enabledelayedexpansion
    if !Menge! lss 0 >>"%Fehler%" echo Fehlerhafte Menge bei Artikel %%a  
    >>"%Aus%" echo %%a%Delim%!Menge!  
    endlocal
)
if exist "%Fehler%" start notepad "%Fehler%"  
Ohne Kopfzeile und Fehlerbehandlung (und weniger les- und wartbar) würde
@echo off & setlocal
del "D:\CSV_Aus.csv" 2>nul  
for /f "usebackq tokens=1-2 delims=," %%a in ("D:\CSV_Ein.csv") do (  
    set /a Menge=%%b-10
    setlocal enabledelayedexpansion
    >>"D:\CSV_Aus.csv" echo %%a,!Menge!  
    endlocal
)
genügen ...

Grüße
bastla
77559
Lösung 77559 24.12.2016 um 20:38:45 Uhr
Goto Top
Hallo bastla,
frohe Weihnachten!

setlocal ohne disabledelayedexpansion funktioniert bei default Einstellungen aber nicht wenn es per Registry Enabled ist.
Ich persönlich mag set-/endlocal in der schleife nicht so sehr (auch wenn es funktioniert) ich würde dann ja eher einen
    >>"D:\CSV_Aus.csv" call echo %%a,%%Menge%%  
nehmen.

Gruß
LotPings
bastla
bastla 26.12.2016 aktualisiert um 23:14:17 Uhr
Goto Top
Wünsche ein frohes Fest gehabt zu haben, Mylord! face-smile

Wenn's auch in vielen Fällen nicht nötig sein dürfte - kein Einwand gegen Deinen Vorschlag. Damit können dann die Zeilen 5 und 7 im zweiten Ansatz entfallen.

Grüße
bastla
ha5257
ha5257 27.12.2016 um 11:00:16 Uhr
Goto Top
Hallo bastla,
Hallo LotPings,

vielen Dank für Eure Hilfe! und nachträglich frohe Weihnachten!

Die Lösung von bastla und Änderung von LotPings funktionieren wunderbar. Ich habe noch 2 Fragen:

1. Wie kann man den Befehl ändern, wenn statt eines Fehlerberichtes über negative Bestand, nur eine 0 die negatvie Bestände ersetzt?

2. und falls die Bestände nicht in Spalte B, sondern in einer andern Spalte ist, Z.B. in Spalte D, kann man den Befehl

for /f "usebackq skip=1 tokens=1-2 delims=%Delim%" %%a in ("%Ein%") do (
set /a Menge=%%b+%Delta%

einfach in

for /f "usebackq skip=1 tokens=1-4 delims=%Delim%" %%a in ("%Ein%") do (
set /a Menge=%%d+%Delta%

ändern? Es gibt aber das Problem, dass nur Spalte A und D in CSV_Aus.csv ausgegeben ist, die Spalte B und C sind nicht bei CSV_Aus.csv ausgegeben.

Liebe Grüße

Lifen
bastla
bastla 27.12.2016 um 11:15:25 Uhr
Goto Top
Hallo ha5257!

Um eine negative Menge durch 0 zu ersetzen könntest Du die Zeile 14 auf
if !Menge! lss 0 set /a Menge=0
ändern.

4 Spalten ausgeben kannst Du (zusötzli ch zu Deiner schon vorgeschlagenen Anpassung der Zeile 11) mit folgender Zeile 15:
 >>"%Aus%" echo %%a%Delim%%%b%Delim%%%c%Delim%!Menge!

Grüße
bastla
ha5257
ha5257 27.12.2016 um 13:35:13 Uhr
Goto Top
Hallo bastla,

vielen Dank für Deine Antwort. Es hat wunderbar geklappt!!

Ich habe dann eine kompliziertere Datei genommen:

Artikel-Nummer|Artikel|Hersteller|Hersteller-Artikelnummer|EAN-Code|Kategorie1|Kategorie2|Kategorie3|Kategorie4|Netto-Preis in EUR|Status|Beschreibung|Tageswerbung|Bestand|Gewicht|Liefertermin|Bestand Außenlager|Lieferzeit aus dem Außenlager|Alternativ Artikel-Nummer|Kennzeichen Allocation|Kennzeichen EOL|Neu im Sortiment|Palette
27.15|Auf Lager|2|0,2090
58.82|Nicht verfügbar|0|0,6340
20.54|Auf Lager|1|0,3760

Und den Script nach Deinem Musterbefehl angepasst:

@echo off & setlocal
set "Ein=D:\TT\artikellisteV.csv"
set "Aus=D:\TT\csv.csv"
set "Delim=|"
set "Delta=-10"
set /p Kopfzeile=<"%Ein%"
"%Aus%" echo %Kopfzeile%
for /f "usebackq skip=1 tokens=1-21 delims=%Delim%" %%a in ("%Ein%") do (
set /a Menge=%%n+%Delta%
setlocal enabledelayedexpansion
if !Menge! lss 0 set /a Menge=0
>>"%Aus%" echo %%e%Delim%%%j%Delim%!Menge!
endlocal
)

Ich habe erwartet, dass am Ende das heurauskommt:
EAN-Code|Netto-Preis in EUR|berechnete Menge

Aber die Datei csv.csv wurde gar nicht erstellt. Kann St in meinem Script reinschauen, wo ich Fehler gemacht habe? Vielen Dank!

LG

Lifen
bastla
bastla 27.12.2016 um 15:41:59 Uhr
Goto Top
Hallo ha5257!

Das scheitert in diesem Fall nicht nur am Trennzeichen (das Zeichen "|" hat ja in Batch eine besondere Bedeutung), sondern auch an der Tatsache, dass mehrere aufeinander folgende Trennzeichen im Batch nur als eines gezählt werden.

Um diese Ausgangsdatei korrekt zu verarbeiten, sollte es dann doch (wie schon oben vorgeschlagen) PowerShell oder zumindest VBScript sein ...

Grüße
bastla