TXT Datei automatisch auslesen und in neue Datei schreiben
Hallo zusammen,
ich habe leider über die SuFu nicht direkt die Antwort auf mein Problem gefunden.
Ich möchte gerne eine txt Datei auslesen und bestimmte Zeilen in eine neue txt bzw. csv übernehmen um hiermit ein Prosuktkatalog via MS Publisher zu erstellen.
folgende Datei liegt mir vor:
vcom.imp
der Inhalt spiegelt eine Artikelliste wieder (Artikelnummer, Artikelbezeichnung inkl. Gewicht, Preis)
Die Zeilen eines Artikels sehen wie folgt aus:
nach der letzten Zeile kommt direkt der nächste Artikel.
Mein Ziel ist es jetzt folgende Spalten zu erstellen und mit Daten aus der txt zu füttern:
Artikelnummer ist das 2.te Feld (hier im Bsp. die 110)
Bezeichnung ist das Feld nach der Position (12) (Ist es hier möglich das Gewicht wegzulassen (1000 g) und dies in eine extra Spalte zu schreiben? Gewicht kommt nicht bei jedem Artikel vor.
Gewicht steht leider in der Bezeichnung fest mit drin, falls nicht trennbar dann die Bezeichnung inkl. Gewicht übernehmen.
Preis ist das Feld nach (13) (hier 2.60)
Bildpfad kommt in der txt nicht vor sollte aber aus der jeweiligen Artikelnummer inkl. z:\Daten\Katalog\Bilder\*.jpg oder*.png in der csv stehen (also hier dann 110.jpg bzw. 110.png)
Die csv sollte dann so aussehen:
Besser
Vielen Dank schon mal im voraus und ich hoffe es ist verständlich geschrieben.
Grüße
Ullimon
vcom.imp
der Inhalt spiegelt eine Artikelliste wieder (Artikelnummer, Artikelbezeichnung inkl. Gewicht, Preis)
Die Zeilen eines Artikels sehen wie folgt aus:
101,110,(12),'Holzofenbrot 1000 g
101,110,(12:2),''
101,110,(14),3
101,110,(434),3
101,110,(13),2.60
101,110,(417),
101,110,(21),0
101,110,(416),0
101,110,(416:2),0
101,110,(416:3),0
101,110,(474),0
nach der letzten Zeile kommt direkt der nächste Artikel.
Mein Ziel ist es jetzt folgende Spalten zu erstellen und mit Daten aus der txt zu füttern:
Artikelnummer, Bezeichnung, Gewicht, Preis, Bildpfad
Artikelnummer ist das 2.te Feld (hier im Bsp. die 110)
Bezeichnung ist das Feld nach der Position (12) (Ist es hier möglich das Gewicht wegzulassen (1000 g) und dies in eine extra Spalte zu schreiben? Gewicht kommt nicht bei jedem Artikel vor.
Gewicht steht leider in der Bezeichnung fest mit drin, falls nicht trennbar dann die Bezeichnung inkl. Gewicht übernehmen.
Preis ist das Feld nach (13) (hier 2.60)
Bildpfad kommt in der txt nicht vor sollte aber aus der jeweiligen Artikelnummer inkl. z:\Daten\Katalog\Bilder\*.jpg oder*.png in der csv stehen (also hier dann 110.jpg bzw. 110.png)
Die csv sollte dann so aussehen:
110; Holzofenbrot 1000 g; 2,60; z:\Daten\Katalog\Bilder\110.jpg
Besser
110; Holzofenbrot; 1000 g; 2,60; z:\Daten\Katalog\Bilder\110.jpg
Vielen Dank schon mal im voraus und ich hoffe es ist verständlich geschrieben.
Grüße
Ullimon
Please also mark the comments that contributed to the solution of the article
Content-Key: 146822
Url: https://administrator.de/contentid/146822
Printed on: April 23, 2024 at 12:04 o'clock
11 Comments
Latest comment
Hallo Ullimon
Könntest du vielleicht einmal einen Ausschnitt nicht nur mit einem sondern mit ca. 3 aneinanderhängenden Produkten zeigen? Und was bedeutet eigentlich die 101 und die Zahlen in Klammern(Sind das die Markierung die anzeigt wo der Preis usw. steht?)? Und die Zeilen dazwischen (z.B. die mit (12:2)), sind das informationen die nicht in die csv sollen?
Mathe172
Könntest du vielleicht einmal einen Ausschnitt nicht nur mit einem sondern mit ca. 3 aneinanderhängenden Produkten zeigen? Und was bedeutet eigentlich die 101 und die Zahlen in Klammern(Sind das die Markierung die anzeigt wo der Preis usw. steht?)? Und die Zeilen dazwischen (z.B. die mit (12:2)), sind das informationen die nicht in die csv sollen?
Mathe172
Hallo Ullimon,
für die Gewichttrennung hab ich heute keinen Nerv mehr, aber dieser Batch:
(Zeile 5 bitte anpassen)
erzeugt mir diese Ausgabe:
Gruß
LotPings
für die Gewichttrennung hab ich heute keinen Nerv mehr, aber dieser Batch:
:: ullimon.cmd::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: LotPings administrator.de 2010-07-13
@echo off&setlocal EnableDelayedExpansion
chcp 1252 >NUL
Set Artikel=Artikel.txt
For /F "tokens=2-4 delims=,()'" %%A in (
'Findstr "(12) (13)" %Artikel% '
) Do Call :ProcLine %%A %%B "%%C%"
Call :OutLine
Goto :Eof
:ProcLine
:: @Echo %*
If defined LastArt if %LastArt%. NEQ %1. Call :OutLine
Set "LastArt=%1"
Set "X_%2=%~3"
Goto :Eof
:OutLine
Echo %LastArt%; %X_12%; !X_13:.=,!; z:\Daten\Katalog\Bilder\%LastArt%.jpg
erzeugt mir diese Ausgabe:
22:52:19 ++D:\Test\2010-07\13____________________
>Ullimon.cmd
110; Holzofenbrot 1000 g; 2,60; z:\Daten\Katalog\Bilder\110.jpg
111; Mischbrot 500 g; 1,45; z:\Daten\Katalog\Bilder\111.jpg
113; Mischbrot 1000 g; 2,40; z:\Daten\Katalog\Bilder\113.jpg
115; Kümmelbrot 500 g; 1,50; z:\Daten\Katalog\Bilder\115.jpg
116; Jägerbrot 500 g; 1,60; z:\Daten\Katalog\Bilder\116.jpg
Gruß
LotPings
Hallo zusammen!
Ich hab die Datei von LotPings abgeändert (hoffe ich darf das ), sodass jetzt das gewicht in eine extraspalte kommt.
Mathe172
Ich hab die Datei von LotPings abgeändert (hoffe ich darf das ), sodass jetzt das gewicht in eine extraspalte kommt.
:: ullimon.cmd::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: LotPings administrator.de 2010-07-13
@echo off&setlocal EnableDelayedExpansion
chcp 1252 >NUL
Set Artikel=articles.txt
For /F "tokens=2-4 delims=,()'" %%A in (
'Findstr "(12) (13)" %Artikel% '
) Do Call :ProcLine %%A %%B "%%C%"
Call :OutLine
Goto :Eof
:ProcLine
:: @Echo %*
If defined LastArt if %LastArt%. NEQ %1. Call :OutLine
Set "LastArt=%1"
Set "X_%2=%~3"
Goto :Eof
:OutLine
echo %X_12%>last_art.txt
for /f "tokens=1,2" %%I in ('findstr " g" last_art.txt') do (
set X_12=%%I
set "weight=%%J g"
)
Echo %LastArt%; !X_12!; %weight%; !X_13:.=,!; z:\Daten\Katalog\Bilder\%LastArt%.jpg
set "weight="
Mathe172
Hallo Mathe172, kein Problem - im Gegenteil Verbesserungen sind immer willkommen.
Die externe Datei lässt sich vermeiden wenn du das Echo mit einer Escape'ten Pipe ^| in die Schleife direkt vor den findstring setzt.
Du gehst bei deinem Ansatz von nur einem Wort für den Artikel und von " g" irgendwo in der Zeile aus - das kann, muss aber nicht zutreffen.
Bevor wir da weiter spekulieren ist IMO der OP nach einem Feedback gefragt.
Gruß
LotPings
:OutLine
echo %X_12%>last_art.txt
for /f "tokens=1,2" %%I in ('findstr " g" last_art.txt') do (
set X_12=%%I
set "weight=%%J g"
)
:OutLine
for /f "tokens=1,2" %%I in ('echo.%X_12%^|findstr " g$" ') do (
Bevor wir da weiter spekulieren ist IMO der OP nach einem Feedback gefragt.
Gruß
LotPings
Hallo Lotpings!
Was die Sache mit dem " g"und dem Problem, dass das Produkt nicht nur ein Wort haben muss, angeht, bin ich deiner Meinung. Bei dem mit " g" könnte man folgendes machen (weiss leider nicht ob das " g$" genau das macht):
Also, dass man am Ende von %X_12% ein Zeichen setzt, das nicht im Produktnamen sein sollte und dann nach " g'Zeichen'" sucht.
Mathe172
Was die Sache mit dem " g"und dem Problem, dass das Produkt nicht nur ein Wort haben muss, angeht, bin ich deiner Meinung. Bei dem mit " g" könnte man folgendes machen (weiss leider nicht ob das " g$" genau das macht):
:OutLine
product=%X_12%/
for /f "tokens=1,2" %%I in ('echo.%product%^|findstr " g/" ') do (
Also, dass man am Ende von %X_12% ein Zeichen setzt, das nicht im Produktnamen sein sollte und dann nach " g'Zeichen'" sucht.
Mathe172
Zitat von @mathe172:
Bei dem mit " g" könnte man folgendes machen (weiss leider nicht ob das " g$" genau das macht):
Doch, genau das tut es siehe auch findstr /?Bei dem mit " g" könnte man folgendes machen (weiss leider nicht ob das " g$" genau das macht):
Alternativ ginge auch
for /f "tokens=1,2" %%I in ('echo.%product%^|findstr /B /L " g" ') do (
echo xxxgxxx|findstr " g"
würde auch einen hier nicht gewünschten Treffer ergeben.
Gruß
LotPings
Hallo ullimon,
Gruß
LotPings
- Ist denn immer ein Gewicht vorhanden ?
- Ist die Einheit immer g ?
- sind die Zahlen ggfs mit einem Tausendertrenner versehen?
Gruß
LotPings
Hallo zusammen!
@77559: Ein Gewicht ist wahrscheinlich nicht immer vorhanden, siehe Holzofenbrot; Art. 110
Mit dem hier müsste es gehen (solange der Produktname nicht mehr als 3 Worte hat, liesse sich jedoch erweitern):
Wahrscheinlich überseh ich was, aber dieser Code funktioniert im Gegensatz zum älteren nicht mit dem von LotPings...
Mathe172
@77559: Ein Gewicht ist wahrscheinlich nicht immer vorhanden, siehe Holzofenbrot; Art. 110
Mit dem hier müsste es gehen (solange der Produktname nicht mehr als 3 Worte hat, liesse sich jedoch erweitern):
:: ullimon.cmd::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: LotPings administrator.de 2010-07-13
@echo on&setlocal EnableDelayedExpansion
chcp 1252 >NUL
Set Artikel=articles.txt
For /F "tokens=2-4 delims=,()'" %%A in (
'Findstr "(12) (13)" %Artikel% '
) Do Call :ProcLine %%A %%B "%%C%"
Call :OutLine
Goto :Eof
:ProcLine
:: @Echo %*
If defined LastArt if %LastArt%. NEQ %1. Call :OutLine
Set "LastArt=%1"
Set "X_%2=%~3"
Goto :Eof
:OutLine
echo %X_12%>last_art.txt
for /f "tokens=1-4" %%I in ('findstr " g" last_art.txt') do (
set X_12=%%I
set /a check=%%J
if !check!==%%J set "weight=%%J g" & set "X_12=%%I"
set /a check=%%K
if !check!==%%K set "weight=%%K g" & set "X_12=%%I %%J"
set /a check=%%L
if !check!==%%L set "weight=%%L g" & set "X_12=%%I %%J %%K"
)
Echo %LastArt%; !X_12!; %weight%; !X_13:.=,!; z:\Daten\Katalog\Bilder\%LastArt%.jpg>>articles.csv
set "weight="
Wahrscheinlich überseh ich was, aber dieser Code funktioniert im Gegensatz zum älteren nicht mit dem von LotPings...
Mathe172
So dies scheint zu klappen:
Bei der Ausgabe wird geprüft ob die letzten beiden Stellen des Artikels " g" enthalten,
Der gefundene Wert -1 wird als Splitter benutzt.
Gruß
LotPings
:: ullimon.cmd::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: LotPings administrator.de 2010-07-14
@echo off&setlocal EnableDelayedExpansion
chcp 1252
Set "Z=-1" & Set "Weight= "
Set Artikel=Artikel.txt
For /F "tokens=2-4 delims=,()'" %%A in (
'Findstr "(12) (13)" %Artikel% '
) Do Call :ProcLine %%A %%B "%%C%"
Call :OutLine
Goto :Eof
:ProcLine
:: @Echo %*
If defined LastArt if %LastArt%. NEQ %1. Call :OutLine
Set "LastArt=%1"
Set "X_%2=%~3"
Goto :Eof
:OutLine
If " g" NEQ "%X_12:~-2%" Goto :OutL2
Set /A "Z-=1,Y=Z+1"
If "!X_12:~%Z%,1!" LSS "A" Goto :OutLine
Set "Weight=!X_12:~%Y%!" & Set "X_12=!X_12:~0,%Y%!" & Set Z=-1
:OutL2
Echo %LastArt%; %X_12%;%weight%; !X_13:.=,!; z:\Daten\Katalog\Bilder\%LastArt%.jpg
set "weight= "
Bei der Ausgabe wird geprüft ob die letzten beiden Stellen des Artikels " g" enthalten,
- wenn ja, wird solange ein Zähler von hinten erhöht bis ein Zeichen nicht kleiner als "A" ist.
Der gefundene Wert -1 wird als Splitter benutzt.
- wenn nein wird die Zeile so mit einem Leerzeichen für Weight ausgegeben.
Gruß
LotPings