Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

TXT Datei automatisch auslesen und in neue Datei schreiben

Frage Entwicklung Batch & Shell

Mitglied: ullimon

ullimon (Level 1) - Jetzt verbinden

13.07.2010, aktualisiert 16:39 Uhr, 3851 Aufrufe, 11 Kommentare

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:

01.
101,110,(12),'Holzofenbrot 1000 g 
02.
101,110,(12:2),'' 
03.
101,110,(14),3 
04.
101,110,(434),3 
05.
101,110,(13),2.60 
06.
101,110,(417), 
07.
101,110,(21),0 
08.
101,110,(416),0 
09.
101,110,(416:2),0 
10.
101,110,(416:3),0 
11.
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:

01.
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:

01.
110; Holzofenbrot 1000 g; 2,60; z:\Daten\Katalog\Bilder\110.jpg
Besser

01.
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
Mitglied: mathe172
13.07.2010 um 17:57 Uhr
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
Bitte warten ..
Mitglied: ullimon
13.07.2010 um 21:20 Uhr
Hallo Mathe172,

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

01.
101,110,(12),'Holzofenbrot 1000 g' 
02.
 
03.
101,110,(12:2),'' 
04.
 
05.
101,110,(14),3 
06.
 
07.
101,110,(434),3 
08.
 
09.
101,110,(13),2.60 
10.
 
11.
101,110,(417), 
12.
 
13.
101,110,(21),0 
14.
 
15.
101,110,(416),0 
16.
 
17.
101,110,(416:2),0 
18.
 
19.
101,110,(416:3),0 
20.
 
21.
101,110,(474),0 
22.
 
23.
101,111,(12),'Mischbrot 500 g' 
24.
 
25.
101,111,(12:2),'' 
26.
 
27.
101,111,(14),3 
28.
 
29.
101,111,(434),3 
30.
 
31.
101,111,(13),1.45 
32.
 
33.
101,111,(417), 
34.
 
35.
101,111,(21),0 
36.
 
37.
101,111,(416),0 
38.
 
39.
101,111,(416:2),0 
40.
 
41.
101,111,(416:3),0 
42.
 
43.
101,111,(474),0 
44.
 
45.
101,113,(12),'Mischbrot 1000 g' 
46.
 
47.
101,113,(12:2),'' 
48.
 
49.
101,113,(14),3 
50.
 
51.
101,113,(434),3 
52.
 
53.
101,113,(13),2.40 
54.
 
55.
101,113,(417), 
56.
 
57.
101,113,(21),0 
58.
 
59.
101,113,(416),0 
60.
 
61.
101,113,(416:2),0 
62.
 
63.
101,113,(416:3),0 
64.
 
65.
101,113,(474),0 
66.
 
67.
101,115,(12),'Kümmelbrot 500 g' 
68.
 
69.
101,115,(12:2),'' 
70.
 
71.
101,115,(14),3 
72.
 
73.
101,115,(434),3 
74.
 
75.
101,115,(13),1.50 
76.
 
77.
101,115,(417), 
78.
 
79.
101,115,(21),0 
80.
 
81.
101,115,(416),0 
82.
 
83.
101,115,(416:2),0 
84.
 
85.
101,115,(416:3),0 
86.
 
87.
101,115,(474),0 
88.
 
89.
101,116,(12),'Jägerbrot 500 g' 
90.
 
91.
101,116,(12:2),'' 
92.
 
93.
101,116,(14),3 
94.
 
95.
101,116,(434),3 
96.
 
97.
101,116,(13),1.60 
98.
 
99.
101,116,(417), 
100.
 
101.
101,116,(21),0 
102.
 
103.
101,116,(416),0 
104.
 
105.
101,116,(416:2),0 
106.
 
107.
101,116,(416:3),0 
108.
 
109.
101,116,(474),0 
110.
 
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
Bitte warten ..
Mitglied: LotPings
13.07.2010 um 23:01 Uhr
Hallo Ullimon,

für die Gewichttrennung hab ich heute keinen Nerv mehr, aber dieser Batch:
01.
:: ullimon.cmd:::::::::::::::::::::::::::::::::::::::::::::::::::::: 
02.
:: LotPings  administrator.de  2010-07-13 
03.
@echo off&setlocal EnableDelayedExpansion 
04.
chcp 1252 >NUL 
05.
Set Artikel=Artikel.txt 
06.
For /F "tokens=2-4 delims=,()'" %%A in ( 
07.
  'Findstr "(12) (13)" %Artikel% ' 
08.
   ) Do Call :ProcLine %%A %%B "%%C%" 
09.
Call :OutLine 
10.
Goto :Eof 
11.
:ProcLine 
12.
:: @Echo %* 
13.
If defined LastArt if %LastArt%. NEQ %1. Call :OutLine 
14.
Set "LastArt=%1" 
15.
Set "X_%2=%~3" 
16.
Goto :Eof 
17.
:OutLine 
18.
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
Bitte warten ..
Mitglied: mathe172
14.07.2010 um 11:23 Uhr
Hallo zusammen!

Ich hab die Datei von LotPings abgeändert (hoffe ich darf das ), sodass jetzt das gewicht in eine extraspalte kommt.

01.
:: ullimon.cmd:::::::::::::::::::::::::::::::::::::::::::::::::::::: 
02.
:: LotPings  administrator.de  2010-07-13 
03.
@echo off&setlocal EnableDelayedExpansion 
04.
chcp 1252 >NUL 
05.
Set Artikel=articles.txt 
06.
For /F "tokens=2-4 delims=,()'" %%A in ( 
07.
  'Findstr "(12) (13)" %Artikel% ' 
08.
   ) Do Call :ProcLine %%A %%B "%%C%" 
09.
Call :OutLine 
10.
Goto :Eof 
11.
:ProcLine 
12.
:: @Echo %* 
13.
If defined LastArt if %LastArt%. NEQ %1. Call :OutLine 
14.
Set "LastArt=%1" 
15.
Set "X_%2=%~3" 
16.
Goto :Eof 
17.
:OutLine 
18.
echo %X_12%>last_art.txt 
19.
for /f "tokens=1,2" %%I in ('findstr " g" last_art.txt') do ( 
20.
set X_12=%%I 
21.
set "weight=%%J g" 
22.
23.
Echo %LastArt%; !X_12!; %weight%; !X_13:.=,!; z:\Daten\Katalog\Bilder\%LastArt%.jpg 
24.
set "weight="
Mathe172
Bitte warten ..
Mitglied: LotPings
14.07.2010 um 11:46 Uhr
Zitat von mathe172:
Ich hab die Datei von LotPings abgeändert (hoffe ich darf das ),
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
Bitte warten ..
Mitglied: mathe172
14.07.2010 um 13:30 Uhr
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):

01.
:OutLine 
02.
product=%X_12%/ 
03.
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
Bitte warten ..
Mitglied: LotPings
14.07.2010 um 14:09 Uhr
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 /?
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
Bitte warten ..
Mitglied: ullimon
14.07.2010 um 14:10 Uhr
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

01.
Altbadisches; Landbrot g
bei raus.

Den Befehl habe ich wie folgt ausgeführt:

01.
ullimon.cmd > artikel.csv
Folgenden Code habe ich benutzt:

01.
:: ullimon.cmd:::::::::::::::::::::::::::::::::::::::::::::::::::::: 
02.
:: LotPings  administrator.de  2010-07-13 
03.
@echo off&setlocal EnableDelayedExpansion 
04.
chcp 1252 >NUL 
05.
Set Artikel=articles.txt 
06.
For /F "tokens=2-4 delims=,()'" %%A in ( 
07.
  'Findstr "(12) (13)" %Artikel% ' 
08.
   ) Do Call :ProcLine %%A %%B "%%C%" 
09.
Call :OutLine 
10.
Goto :Eof 
11.
:ProcLine 
12.
:: @Echo %* 
13.
If defined LastArt if %LastArt%. NEQ %1. Call :OutLine 
14.
Set "LastArt=%1" 
15.
Set "X_%2=%~3" 
16.
Goto :Eof 
17.
:OutLine 
18.
echo %X_12%>last_art.txt 
19.
for /f "tokens=1,2" %%I in ('findstr " g" last_art.txt') do ( 
20.
set X_12=%%I 
21.
set "weight=%%J g" 
22.
23.
Echo %LastArt%; !X_12!; %weight%; !X_13:.=,!; z:\Daten\Katalog\Bilder\%LastArt%.jpg 
24.
set "weight="
Grüße Ullimon
Bitte warten ..
Mitglied: LotPings
14.07.2010 um 14:18 Uhr
Hallo ullimon,

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

Gruß
LotPings
Bitte warten ..
Mitglied: mathe172
14.07.2010 um 15:09 Uhr
Hallo zusammen!

@LotPings: 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):
01.
:: ullimon.cmd:::::::::::::::::::::::::::::::::::::::::::::::::::::: 
02.
:: LotPings  administrator.de  2010-07-13 
03.
@echo on&setlocal EnableDelayedExpansion 
04.
chcp 1252 >NUL 
05.
Set Artikel=articles.txt 
06.
For /F "tokens=2-4 delims=,()'" %%A in ( 
07.
  'Findstr "(12) (13)" %Artikel% ' 
08.
   ) Do Call :ProcLine %%A %%B "%%C%" 
09.
Call :OutLine 
10.
Goto :Eof 
11.
:ProcLine 
12.
:: @Echo %* 
13.
If defined LastArt if %LastArt%. NEQ %1. Call :OutLine 
14.
Set "LastArt=%1" 
15.
Set "X_%2=%~3" 
16.
Goto :Eof 
17.
:OutLine 
18.
echo %X_12%>last_art.txt 
19.
for /f "tokens=1-4" %%I in ('findstr " g" last_art.txt') do ( 
20.
set X_12=%%I 
21.
set /a check=%%J 
22.
if !check!==%%J set "weight=%%J g" & set "X_12=%%I" 
23.
set /a check=%%K 
24.
if !check!==%%K set "weight=%%K g" & set "X_12=%%I %%J" 
25.
set /a check=%%L 
26.
if !check!==%%L set "weight=%%L g" & set "X_12=%%I %%J %%K" 
27.
28.
Echo %LastArt%; !X_12!; %weight%; !X_13:.=,!; z:\Daten\Katalog\Bilder\%LastArt%.jpg>>articles.csv 
29.
set "weight="
Wahrscheinlich überseh ich was, aber dieser Code funktioniert im Gegensatz zum älteren nicht mit dem von LotPings...

Mathe172
Bitte warten ..
Mitglied: LotPings
14.07.2010 um 16:05 Uhr
So dies scheint zu klappen:
01.
:: ullimon.cmd:::::::::::::::::::::::::::::::::::::::::::::::::::::: 
02.
:: LotPings  administrator.de  2010-07-14 
03.
@echo off&setlocal EnableDelayedExpansion 
04.
chcp 1252 
05.
Set "Z=-1" & Set "Weight= " 
06.
Set Artikel=Artikel.txt 
07.
For /F "tokens=2-4 delims=,()'" %%A in ( 
08.
  'Findstr "(12) (13)" %Artikel% ' 
09.
   ) Do Call :ProcLine %%A %%B "%%C%" 
10.
Call :OutLine 
11.
Goto :Eof 
12.
:ProcLine 
13.
:: @Echo %* 
14.
If defined LastArt if %LastArt%. NEQ %1. Call :OutLine 
15.
Set "LastArt=%1" 
16.
Set "X_%2=%~3" 
17.
Goto :Eof 
18.
:OutLine 
19.
If " g" NEQ "%X_12:~-2%" Goto :OutL2 
20.
Set /A "Z-=1,Y=Z+1" 
21.
If "!X_12:~%Z%,1!" LSS "A" Goto :OutLine 
22.
Set "Weight=!X_12:~%Y%!" & Set "X_12=!X_12:~0,%Y%!" & Set Z=-1 
23.
:OutL2 
24.
Echo %LastArt%; %X_12%;%weight%; !X_13:.=,!; z:\Daten\Katalog\Bilder\%LastArt%.jpg 
25.
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst Einzelne Zeilen in txt Datei speichern und auslesen (7)

Frage von noah1400 zum Thema Batch & Shell ...

Webentwicklung
HTML Output in eine txt Datei mit VisualBasicScript (2)

Frage von coca22COCA zum Thema Webentwicklung ...

Batch & Shell
Merkwürdige Zeilenformatierung in txt Datei (3)

Frage von miczar zum Thema Batch & Shell ...

Microsoft
Sfirm STA Datei automatisch kopieren (1)

Frage von thomasreischer zum Thema Microsoft ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...