Batch Stückliste korrekt formatiert abspeichern (mehrere Probleme)

Probby

Newbie
Registriert
Sep. 2017
Beiträge
3
Moin,

ich habe eine unformatierte Stückliste und möchte sie formatieren und neu abspeichern. Ich konnte schon einiges selber herausfinden, jedoch komme ich nicht weiter.

Zunächst hier die Stückliste wie ich sie erhalte:
Code:
Stücklistenvergleich

Primärstückliste   54682496, 0505, , 3

Datum:             30.09.2017
-----------------------------------------------------------------------------------------------------------------
|Obj |Pos.|PTp|CAD|ObjektId|Objektkurztext                          |  Menge|ME|    |    | Menge|  Menge|ME|    |
-----------------------------------------------------------------------------------------------------------------
|    |0001|L  |X  |20364701|Halter                                  |    10 |ST|    |    |      |     6 |ST|    |
|    |0002|L  |X  |20365549|Adapter                                 |     8 |ST|    |    |      |    10 |ST|    |
|    |0003|L  |X  |20369622|Schraube                                |     2 |ST|    |    |      |     2 |ST|    |
|    |0010|R  |X  |20115138|Rohr mit Flanschanschluss               |12,000 |M |    |    |      |12,000 |M |    |
|    |0220|R  |X  |20244473|Schlauch                                | 6,000 |M |    |    |      | 6,000 |M |    |
|    |5550|L  |   |20234973|Scheibe Größe D40                       |    12 |ST|    |    |      |    12 |ST|    |
-----------------------------------------------------------------------------------------------------------------
Wichtig für mich...
...8stellige Nummer der Primärstückliste (Zeile 3: 54682496)
...4stellige Positionsnummer ohne anführende Nullen. [halb CHECK]
...8stellige Materialnummer (z.B. 20364701). [CHECK]
...Name des Bauteils ohne nachkommende Leerzeichen [halb CHECK]
...ggf. Änderung der Mengen (z.B. Zeile 9: alt ist 10, neu ist 6, demnach ist die Differenz -4)


Was ich bisher geschafft habe:
Code:
@echo off &setlocal enabledelayedexpansion
set order=Projektname
set mat=12345678
set ugd=4205148
set Quelle=C:\stueckliste_roh.txt
set Ziel=C:\stueckliste_sauber.txt
type nul>"%Ziel%"
>>"%Ziel%" echo Order-Nr: %order%
>>"%Ziel%" echo MAT: %mat% / UGD: %ugd%

for /f "eol=- tokens=* skip=8 usebackq delims=" %%i in ("%Quelle%") do (
set "Zeile=%%i"
>>"%Ziel%" echo - added pos.!Zeile:~6,4!  (!Zeile:~19,8! - !Zeile:~28,40!^)
)

Die Ausgabe dazu:
Code:
Order-Nr: Projektname
MAT: 12345678 / UGD: 4205148
- added pos.0001  (20364701 - Halter                                  )
- added pos.0002  (20365549 - Adapter                                 )
- added pos.0003  (20369622 - Schraube                                )
- added pos.0010  (20115138 - Rohr mit Flanschanschluss               )
- added pos.0220  (20244473 - Schlauch                                )
- added pos.5550  (20234973 - Scheibe Größe D40                     )

Was ich will:
Code:
Order-Nr: Projektname
MAT: 54682496 / UGD: 4205148
- added pos.1  (20364701 - Halter)
- added pos.2  (20365549 - Adapter)
- added pos.3  (20369622 - Schraube)
- added pos.10  (20115138 - Rohr mit Flanschanschluss)
- added pos.220  (20244473 - Schlauch)
- added pos.5550  (20234973 - Scheibe Größe D40)


Die anführenden Nullen kann man mit Modulo weg kriegen z.B.
set z1=10000
set z2=!Zeile:~6,4!
set /a ges=%z1%%z2%%%10000
echo %ges%

Jedoch lässt sich das in der FOR-Schleife nicht verarbeiten. Es wird kein echo angezeicht. Außerhalb der Schleife funktioniert es..

Wäre MEGA wenn ihr mir helfen könnt :)

Gruß
Probby
 
Zuletzt bearbeitet:
Ist das eine Hausaufgabe? Ansonsten ist es etwas masochistisch, so was mit MsDos-Kommands zu machen, da gibt es bessere Möglichkeiten und Sprachen.
 
Nein das ist für die Arbeit.
Ich habe leider zu wenig Erfahrung mit sowas deshalb weiß ich nicht ob das masochistisch ist. Welche Sprache schlägst du denn vor? Ich habe mir das bisschen batch die letzten Tage beigebracht.
 
PHuV schrieb:
Ist das eine Hausaufgabe? Ansonsten ist es etwas masochistisch, so was mit MsDos-Kommands zu machen, da gibt es bessere Möglichkeiten und Sprachen.
DOS ist seit langer Zeit kein Bestandteil von Windows mehr. Aktuelle Windowsversionen können keine DOS-Programme ausführen. Die NT-Konsole ist kein DOS-Fenster. Die NT-Konsole ist die NT-Konsole.
 
asdfman schrieb:
Aktuelle Windowsversionen können keine DOS-Programme ausführen. Die NT-Konsole ist kein DOS-Fenster.
Ich dachte immer, das gilt nur für die 32-Bit-Version von Windows, weil im Long-Mode zwar ein 32-Bit-Kompatibilitätsmodus zur Verfügung steht aber nix für 16-Bit-Programme (wie der Virtual 86-Mode).
 
Hi, probiers mal damit (getestet mit Windows 10)

Code:
@echo off &setlocal enabledelayedexpansion
set order=Projektname
set mat=12345678
set ugd=4205148
set Quelle=in.txt
set Ziel=out.txt
type nul>"%Ziel%"
echo Order-Nr: %order% >> "%Ziel%" 
echo MAT: %mat% / UGD: %ugd% >> "%Ziel%" 
 
for /f "eol=- tokens=* skip=8 usebackq delims=" %%i in ("%Quelle%") do (
set "Zeile=%%i"
set "posnr=!Zeile:~6,4!"
set "prodnr=!Zeile:~19,8!"
set "prodname=!Zeile:~28,40!"

REM entferne führende nullen
for /l %%a in (1,1,100) do if "!posnr:~0,1!"=="0" set posnr=!posnr:~1!
REM entferne leerzeichen am ende (geht für bis zu 100 zeichen)
for /l %%a in (1,1,100) do if "!prodnr:~-1!"==" " set prodnr=!prodnr:~0,-1!
REM entferne leerzeichen am ende (geht für bis zu 100 zeichen)
for /l %%a in (1,1,100) do if "!prodname:~-1!"==" " set prodname=!prodname:~0,-1!

echo - added pos.!posnr!  (!prodnr! - !prodname!^) >> "%Ziel%"
)
 
Hi hoppler, funktioniert super vielen Dank! Muss jetzt noch gucken wieso das eigentlich funktioniert ^^
 
asdfman schrieb:
DOS ist seit langer Zeit kein Bestandteil von Windows mehr. Aktuelle Windowsversionen können keine DOS-Programme ausführen. Die NT-Konsole ist kein DOS-Fenster. Die NT-Konsole ist die NT-Konsole.
Da ist wieder jemand besonders altklug und neumalschlau wieder besseren Wissens. :rolleyes: Das ist reines DOS-Batch von MS-Dos, auch wenn das unter einer NT-Konsole bzw. Nachfolgern ausgeführt wird. :rolleyes: Prüf es selbst: Du kannst diese Scripte 1:1 in MS-DOS ausführen, da hat sich kaum was geändert. Ja, es ist eine zu MSDOS abwärtskompatible Konsole cmd.exe anstelle von command.com. Aber es sind nach wievor DOS-Befehle.
Probby schrieb:
Nein das ist für die Arbeit.
Ich habe leider zu wenig Erfahrung mit sowas deshalb weiß ich nicht ob das masochistisch ist. Welche Sprache schlägst du denn vor? Ich habe mir das bisschen batch die letzten Tage beigebracht.
Der offizielle Nachfolger davon ist übrigens seit Windows 7 PowerShell, nur nutzen diese wenige. Und bei Windows 10 ist sogar Bash möglich, was in Kombination mit AWK und Co. viel bessere Stringverarbeitung bietet. Perl ist eine gute Alternative, da hier sehr gut Regular Expressions angewendet werden können. Alternativ kann man sich auch auf allen Windows-Systemen die Cygwin-Tools installieren, welche Unix-Kommandos sehr gut nachstellen können.

Perl und Bash/awk und Co. sind deshalb günstiger, weil sie meisten 1:1 für Linux/Unix weiterverwendet werden können, während PowerShell und Co. nur auf Windows läuft. Unter Linux läuft das alles auch etwas performanter, je nach Anwendung.

Dennoch ist Dein Datenformat mangelhaft. Besser wäre es, CSV-Dateien mit eindeutigen Strukturen zu verwenden, die Du viel leichter mit entsprechenden Sprachen sogar intern gut verarbeiten kannst (z.B. Java). Optimal wäre es, solche Daten direkt aus einer Datenbank zu lesen, bzw. solche Daten generell über eine Datenbank mit SQL-Mitteln zu ermitteln. Gerade per SQL hast Du viel mehr Möglichkeiten, hier Deine Datenstrukturen entsprechend zu erstellen und zusammenzubauen.

Sprich, frage mal die Leute, ob sie nicht die Stückliste per CSV exportieren können, daß macht vieles für Dich leichter. Oder gehe direkt an die Datenbank heran, welche die Daten beinhaltet. Ansonsten mal den Hersteller der Anwendung kontaktieren und genaueres erfragen. So stellt man keine Daten bereit, die man weiterverarbeiten möchte.

Weiteres gerne per PM.
 
Zuletzt bearbeitet:
PHuV schrieb:
Der offizielle Nachfolger davon ist übrigens seit Windows 7 PowerShell, nur nutzen diese wenige.
Nur wenige? Lässt sich das irgendwie belegen oder ist das eine rein persönliche Erfahrung die Deinem Umfeld geschuldet ist?


PHuV schrieb:
Und bei Windows 10 ist sogar Bash möglich, was in Kombination mit AWK und Co. viel bessere Stringverarbeitung bietet. Perl ist eine gute Alternative, da hier sehr gut Regular Expressions angewendet werden können.
Alternativ kann man sich auch auf allen Windows-Systemen die Cygwin-Tools installieren, welche Unix-Kommandos sehr gut nachstellen können.
Reguläre Ausdrücke lassen sich auch in der PowerShell verwenden. Warum sollte man sich also irgendwie was installieren für eine solche Aufgabe?

PHuV schrieb:
Perl und Bash/awk und Co. sind deshalb günstiger, weil sie meisten 1:1 für Linux/Unix weiterverwendet werden können,
Linux ist richtig, UNIX eher nicht. Gerade die Bash findest Du i.d.R. nur bei Linux standardmäßig aktiv. Man kann also, wenn man nicht aufpasst, sehr schnell Linux-only-Scripts bauen.

Und Perl und awk sind nicht gerade angenehm zu benutzen. Für ein Nicht-Vollblut-Techie zu kryptisch. Da dürfte die PowerShell um etwas lesbarer sein (auch wenn Vieles an awk, Perl etc. erinnert *g*). Zu mal die auch eine einfache Entwicklungsumgebung mit sich bringt, die das Schreiben der Scripts erlleichtert.

PHuV schrieb:
während PowerShell und Co. nur auf Windows läuft.
Falsch. Siehe dazu auch:
https://github.com/PowerShell/PowerShell
Abgesehen davon, dass es für ein solch kurzes Skript es kaum Sinn macht, dieses explizit plattformübergreifend zu schreiben nur weil der User es vielleicht(!) irgendwann(!) mal auf einer anderen Plattform als Windows brauchen könnte.

PHuV schrieb:
Dennoch ist Dein Datenformat mangelhaft. Besser wäre es, CSV-Dateien mit eindeutigen Strukturen zu verwenden, die Du viel leichter mit entsprechenden Sprachen sogar intern gut verarbeiten kannst (z.B. Java). Optimal wäre es, solche Daten direkt aus einer Datenbank zu lesen, bzw. solche Daten generell über eine Datenbank mit SQL-Mitteln zu ermitteln. Gerade per SQL hast Du viel mehr Möglichkeiten, hier Deine Datenstrukturen entsprechend zu erstellen und zusammenzubauen.

Sprich, frage mal die Leute, ob sie nicht die Stückliste per CSV exportieren können, daß macht vieles für Dich leichter. Oder gehe direkt an die Datenbank heran, welche die Daten beinhaltet. Ansonsten mal den Hersteller der Anwendung kontaktieren und genaueres erfragen. So stellt man keine Daten bereit, die man weiterverarbeiten möchte.
Das wäre in der Tat besser.
 
PHuV schrieb:
Da ist wieder jemand besonders altklug und neumalschlau wieder besseren Wissens. :rolleyes: Das ist reines DOS-Batch von MS-Dos, auch wenn das unter einer NT-Konsole bzw. Nachfolgern ausgeführt wird. :rolleyes: Prüf es selbst: Du kannst diese Scripte 1:1 in MS-DOS ausführen, da hat sich kaum was geändert. Ja, es ist eine zu MSDOS abwärtskompatible Konsole cmd.exe anstelle von command.com. Aber es sind nach wievor DOS-Befehle.

dos1hvky0.png

dos2xfkij.png
 
Zurück
Oben