ullimon
Goto Top

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:

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

Content-Key: 146822

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

Printed on: April 23, 2024 at 12:04 o'clock

Member: mathe172
mathe172 Jul 13, 2010 at 15:57:38 (UTC)
Goto Top
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
Member: ullimon
ullimon Jul 13, 2010 at 19:20:53 (UTC)
Goto Top
Hallo Mathe172,

hier ein Auszug aus der txt Datei insgesammt hat die Datei 83,5KB:

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

101,111,(12),'Mischbrot 500 g'  

101,111,(12:2),''  

101,111,(14),3

101,111,(434),3

101,111,(13),1.45

101,111,(417),

101,111,(21),0

101,111,(416),0

101,111,(416:2),0

101,111,(416:3),0

101,111,(474),0

101,113,(12),'Mischbrot 1000 g'  

101,113,(12:2),''  

101,113,(14),3

101,113,(434),3

101,113,(13),2.40

101,113,(417),

101,113,(21),0

101,113,(416),0

101,113,(416:2),0

101,113,(416:3),0

101,113,(474),0

101,115,(12),'Kümmelbrot 500 g'  

101,115,(12:2),''  

101,115,(14),3

101,115,(434),3

101,115,(13),1.50

101,115,(417),

101,115,(21),0

101,115,(416),0

101,115,(416:2),0

101,115,(416:3),0

101,115,(474),0

101,116,(12),'Jägerbrot 500 g'  

101,116,(12:2),''  

101,116,(14),3

101,116,(434),3

101,116,(13),1.60

101,116,(417),

101,116,(21),0

101,116,(416),0

101,116,(416:2),0

101,116,(416:3),0

101,116,(474),0

Die Zahlen in Klammern sind denke ich Markierungen.

Die Zeilen wo ich nicht genannt habe brauche ich nicht. Was die Zahlen teilweise bedeuten weiß ich leider nicht, ich benötige diese auch nicht.

Achso, hatte ich vergessen, lauffähig sollte das ganze wenn möglich unter Windows sein.

Grüße

Ullimon
Mitglied: 77559
77559 Jul 13, 2010 at 21:01:41 (UTC)
Goto Top
Hallo Ullimon,

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
(Zeile 5 bitte anpassen)
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
Member: mathe172
mathe172 Jul 14, 2010 at 09:23:55 (UTC)
Goto Top
Hallo zusammen!

Ich hab die Datei von LotPings abgeändert (hoffe ich darf das face-wink), 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
Mitglied: 77559
77559 Jul 14, 2010 at 09:46:24 (UTC)
Goto Top
Zitat von @mathe172:
Ich hab die Datei von LotPings abgeändert (hoffe ich darf das face-wink),
Hallo Mathe172, kein Problem - im Gegenteil Verbesserungen sind immer willkommen.

: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"
)
Die externe Datei lässt sich vermeiden wenn du das Echo mit einer Escape'ten Pipe ^| in die Schleife direkt vor den findstring setzt.
:OutLine
for /f "tokens=1,2" %%I in ('echo.%X_12%^|findstr " g$" ') do (
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
Member: mathe172
mathe172 Jul 14, 2010 at 11:30:45 (UTC)
Goto Top
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):

: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
Mitglied: 77559
77559 Jul 14, 2010 at 12:09:52 (UTC)
Goto Top
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 face-wink siehe auch findstr /?
Alternativ ginge auch
for /f "tokens=1,2" %%I in ('echo.%product%^|findstr /B /L " g" ') do (
ist auch besser, da findstr by default im RegEx-Modus ist, und da werden mit dem Leerzeichen mehrere alternative Suchstrings getrennt, es wird also ignoriert.
echo xxxgxxx|findstr " g"
würde auch einen hier nicht gewünschten Treffer ergeben.

Gruß
LotPings
Member: ullimon
ullimon Jul 14, 2010 at 12:10:26 (UTC)
Goto Top
Hallo Mathe172 und LotPings,

vielen Dank für eure Mühen. Bis jetzt funktioniert es genauso wie gewünscht, nur muß ich LotPings zustimmen. Es gibt Zeilen in welcher vor dem "g" ein anderes Wort steht. Zum Beispiel
"Altbadisches Landbrot 4000 g" --> hier kommt dann

Altbadisches; Landbrot g

bei raus.

Den Befehl habe ich wie folgt ausgeführt:

ullimon.cmd > artikel.csv

Folgenden Code habe ich benutzt:

:: 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="  

Grüße Ullimon
Mitglied: 77559
77559 Jul 14, 2010 at 12:18:17 (UTC)
Goto Top
Hallo ullimon,

  • Ist denn immer ein Gewicht vorhanden ?
  • Ist die Einheit immer g ?
  • sind die Zahlen ggfs mit einem Tausendertrenner versehen?

Gruß
LotPings
Member: mathe172
mathe172 Jul 14, 2010 at 13:09:25 (UTC)
Goto Top
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):
:: 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
Mitglied: 77559
77559 Jul 14, 2010 at 14:05:06 (UTC)
Goto Top
So dies scheint zu klappen:
:: 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.
Das schliesst alle Ziffern Punkt Koma Leerzeichen etc ein.
Der gefundene Wert -1 wird als Splitter benutzt.
  • wenn nein wird die Zeile so mit einem Leerzeichen für Weight ausgegeben.

Gruß
LotPings