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

Datei suchen und Dateiname in CSV einfügen

Frage Entwicklung Batch & Shell

Mitglied: Kariya

Kariya (Level 1) - Jetzt verbinden

19.07.2012 um 22:32 Uhr, 2885 Aufrufe, 6 Kommentare

Hallo ich habe eine recht große CSV Datei, welche Artikeldaten enthält und später in einen Onlineshop importiert werden soll.
Die CSV ist zum größten Teil fertig was nun fehlt sind die Verknüpfungen zu Bildern.

Ist es möglich eine Batchdatei zu schreiben womit folgende Abhandlungen durchgeführt werden können:

1. Wert aus einer bestimmten Spalte einer CSV auslesen (Bsp.: Artikelnummer)
2. Datei mit dem Spaltenwert von 1. auf FTP suchen (Bsp. Artikelnummer.jpg)
3. Wenn Datei mit dem Spaltenwert von 1. vorhanden dann Link in eine Spalte der CSV einfügen (http://www.meineseite.de/artikelnummer.jpg) wenn Datei nicht vorhanden dann in der nächsten Zeile weiter suchen.

Das ganze dann für alle Zeilen der CSV (ca. 23.000).

Evtl. kann mir von euch jemand Helfen da ich mir hier schon einige Tips für die Batchprogrammierung holen konnte.
Mitglied: pieh-ejdsch
20.07.2012 um 20:30 Uhr
moin Kariya,

möglich ist das schon.

Erstmal ein paar Gegenfragen.
Um die wievielte Spalte handelt es sich denn bei den zu suchenden (Datei)namen in der CSV?
Ist das Semikolon das Trennzeichen?
Steht in jeder Spalte ein Wert (wenigstens ein Leerzeichen)?
In die Wievielte Spalte soll der Link bei Fund eingetragen werden?
Handelt es sich dabei um nur eine FTP Seite?

Gruß Phil
Bitte warten ..
Mitglied: Kariya
23.07.2012 um 17:56 Uhr
Hallo Phil,

Ich möchte kurz auf deine Fragen eingehen.

1. der zu suchende Name befindet sich in Spalte 2
2. Trennsymbol ist das Semikolon
3. Nein in leeren Spalten steht kein Wert (auch kein Freizeichen)
4. Eingetragen werden soll der Wert dann in Spalte 22
5. Ja es wird sich nur um ein FTP-Verzeichnis handeln

Falls du eine Beispieldatei benötigst kann ich dir auch gern eine zukommen lassen.

Grüße Kariya
Bitte warten ..
Mitglied: pieh-ejdsch
25.07.2012, aktualisiert 09.08.2012
moin Kariya,

Dazu musst Du Dir noch, wenn nötig, die wget.exe herunterladen.
Der Batch schreibt Dir erst die volle Verzeichnissliste des Servers fertig und schreibt dann eine neue CSV.

Die FehlerUmleitung vom wget ist so gewollt, da wget das Handle 2 für alle möglichen Meldungen nutzt muss es wieder in Handle 1 (STDOUT) dubliziert werden, um mit den Ausgaben in einer Befehlskette zu arbeiten.

01.
@echo off 
02.
setlocal 
03.
 
04.
 rem nur den Pfad zur wget.exe angeben 
05.
set "wgetPath=D:\wsusoffline\bin\" 
06.
set "Server=ftp://ftp.freenet.de/debian/" 
07.
 
08.
 rem InklusiveListe Dateiendung Trennung mit Komma 
09.
 rem bei allen Dateien nichts angeben 
10.
set "Typ=bmp,jpg" 
11.
set InCSVList="D:\test\IN.txt" 
12.
set OutCSVList="D:\test\Out.txt" 
13.
type nul>%OutCSVList% 
14.
 
15.
 rem wget in Path eintragen 
16.
(echo ;%path:;=;&echo(;%;)|find /i ";%wgetpath%;" >nul || set "path=%path%;%wgetpath%" 
17.
 rem prüfe ob wget gefunden 
18.
(wget) 2>&1 |findstr /n "Befehl nicht" &&echo(&&echo wget.exe nicht gefunden. Bitte Pfad angeben!&& exit /b 1 
19.
 
20.
set Wgetlog="%temp%\Wget.log" 
21.
set Wgettemp="%temp%\Wgettemp" 
22.
if defined typ set "Typ=-A %typ%" 
23.
echo Teste Server ... 
24.
(wget --spider  %server% -nv -nd) 2>&1 |find "]" >nul &&echo Erfolgreich.||echo Serverfehler.&& echo(&& (wget --spider  %server% -nv -nd &exit /b 2)  
25.
 
26.
echo Erstelle Liste des FTP-Verzeichnisses 
27.
echo dies kann einige Minuten Dauern 
28.
echo Bitte Warten ... 
29.
 
30.
(wget --spider  %server% %typ% -r -nv -nd) 2>&1 |find "]" |find /v ".listing" >%wgettemp% 
31.
>%wgetlog% (for /f "usebackq tokens=4" %%i in (%wgettemp%) do @echo %%l) 
32.
 
33.
echo Verzeichnissliste vom Server wurde erstellt. 
34.
echo Vergleiche CSV mit Verzeichnissen. 
35.
 
36.
for /f "usebackq delims=" %%i in (%InCSVList%) do set "Line=%%i" & call :search 
37.
goto :weiter 
38.
:search 
39.
set "Line= %Line:;=; %" 
40.
for /f "tokens=1-22*delims=;" %%a in ("%Line%") do ( 
41.
  set "Name=%%b" 
42.
  set "Part1=%%a;%%b;%%c;%%d;%%e;%%f;%%g;%%h;%%i;%%j;%%k;%%l;%%m;%%n;%%o;%%p;%%q;%%r;%%s;%%t;%%u;" 
43.
  set "Part3=;%%w" 
44.
  call :write  
45.
46.
exit /b 
47.
:write 
48.
set "Name=%Name:; =;%" 
49.
set "URL=" 
50.
for /f "Delims=" %%i in ('findstr /e "\/%Name%...." %wgetlog% ') do set "URL=%%i" 
51.
setlocal enabledelayedexpansion 
52.
set "Line=!Part1!!URL!!Part2!" 
53.
set "Line=!Line:* =!" 
54.
set "Line=!Line:; =;!" 
55.
>>%OutCSVList% echo !Line! 
56.
endlocal 
57.
exit /b 
58.
:weiter 
59.
echo CSV Fertiggestellt. 
60.
exit /b 0

Gruß Phil
Bitte warten ..
Mitglied: pieh-ejdsch
29.07.2012 um 23:46 Uhr
moin,

Ich hab nochmal 2 Zeilen ausgebessert (Zeile 05 und Zeile 16)

Gruß Phil
Bitte warten ..
Mitglied: Kariya
31.07.2012, aktualisiert 07.08.2012
So ich hab das ganze nochmal getestet leider noch funktioniert das ganze noch nicht zu 100%.

Mein Quelltext sieht wie folgt aus:

01.
@echo off  
02.
setlocal  
03.
 
04.
  rem nur den Pfad zur wget.exe angeben  
05.
set "wgetPath=C:\Programme\GnuWin32\bin\"  
06.
set "Server=ftp://FTP.Server"  
07.
 
08.
 rem InklusiveListe Dateiendung Trennung mit Komma  
09.
 rem bei allen Dateien nichts angeben  
10.
set "Typ=bmp,jpg"  
11.
set InCSVList="E:\test\modified_01.csv"  
12.
set OutCSVList="E:\test\modified.csv"  
13.
type nul>%OutCSVList%  
14.
 
15.
 rem wget in Path eintragen  
16.
(echo %path:;=&echo(%)|find /i "wget.exe" >nul || set "path=%path%;%wgetpath%"  
17.
 rem prüfe ob wget gefunden 
18.
(wget) 2>&1 |findstr /n "Befehl nicht" &&echo(&&echo wget.exe nicht gefunden. Bitte Pfad angeben!&& exit /b 1  
19.
 
20.
set Wgetlog="%temp%\Wget.log"  
21.
set Wgettemp="%temp%\Wgettemp"  
22.
if defined typ set "Typ=-A %typ%"  
23.
echo Teste Server ...  
24.
 
25.
(wget --ftp_user=user --ftp-password=password --spider  %server% -nv -nd) 2>&1 |find "]" >nul &&echo  
26.
 
27.
Erfolgreich.||echo Serverfehler.&& echo(&& (wget --spider  %server% -nv -nd &exit /b 2)   
28.
 
29.
 
30.
echo Erstelle Liste des FTP-Verzeichnisses  
31.
echo dies kann einige Minuten Dauern  
32.
echo Bitte Warten ...  
33.
 
34.
(wget --spider  %server% %typ% -r -nv -nd) 2>&1 |find "]" |find /v ".listing" >%wgettemp% 
35.
>%wgetlog% (for /f "usebackq tokens=4" %%i in (%wgettemp%) do @echo %%l) 
36.
 
37.
echo Verzeichnissliste vom Server wurde erstellt.  
38.
echo Vergleiche CSV mit Verzeichnissen.  
39.
 
40.
for /f "usebackq delims=" %%i in (%InCSVList%) do set "Line=%%i" & call :search  
41.
goto :weiter  
42.
:search 
43.
set "Line= %Line:;=; %" 
44.
for /f "tokens=1-22*delims=;" %%a in ("%Line%") do (  
45.
  set "Name=%%b"  
46.
  set "Part1=%%a;%%b;%%c;%%d;%%e;%%f;%%g;%%h;%%i;%%j;%%k;%%l;%%m;%%n;%%o;%%p;%%q;%%r;%%s;%%t;%%u;"  
47.
  set "Part3=;%%w"  
48.
  call :write   
49.
)  
50.
exit /b  
51.
:write  
52.
set "Name=%Name:; =;%"  
53.
set "URL="http://www.coxx.it/pictures/""  
54.
for /f "Delims=" %%i in ('findstr /e "\/%Name%...." %wgetlog% ') do set "URL=%%i"  
55.
setlocal enabledelayedexpansion  
56.
set "Line=!Part1!!URL!!Part2!"  
57.
set "Line=!Line:* =!"  
58.
set "Line=!Line:; =;!"  
59.
>>%OutCSVList% echo !Line!  
60.
endlocal  
61.
exit /b  
62.
:weiter  
63.
echo CSV Fertiggestellt.  
64.
exit /b 0
In die modified.csv wird lediglich ein teil der ersten Zeile geschrieben.

"XTSOL";"PCS719719";"2";"0";"1";"default";"NINTENDO";"0";"132.47";"";"";"";"1";"1";"";"0045496443597";"0.00";"default";"0";"0";"0.0000";"http://www.coxx.it/pictures/"

danach ist leider schluss. Was mache ich Falsch bzw. was habe ich vergessen an meine Umgebung anzupassen?
Bitte warten ..
Mitglied: Kariya
08.08.2012, aktualisiert um 22:35 Uhr
Ich habe in den letzten Tagen selbst noch ein wenig probiert, bin aber leider auf keinen grünen Zweig gekommen.

01.
@echo off  
02.
setlocal  
03.
 
04.
  rem nur den Pfad zur wget.exe angeben  
05.
set "wgetPath=C:\Programme\GnuWin32\bin\"  
06.
set "Server=ftp://coxx.it"  
07.
 
08.
 rem InklusiveListe Dateiendung Trennung mit Komma  
09.
 rem bei allen Dateien nichts angeben  
10.
set "Typ=bmp,jpg"  
11.
set InCSVList="E:\test\modified_01.csv"  
12.
set OutCSVList="E:\test\modified.csv"  
13.
type nul>%OutCSVList%  
14.
 
15.
 rem wget in Path eintragen  
16.
(echo %path:;=&echo(%)|find /i "wget.exe" >nul || set "path=%path%;%wgetpath%"  
17.
 rem prüfe ob wget gefunden 
18.
(wget) 2>&1 |findstr /n "Befehl nicht" &&echo(&&echo wget.exe nicht gefunden. Bitte Pfad angeben!&& exit /b 1  
19.
 
20.
set Wgetlog="%temp%\Wget.log"  
21.
set Wgettemp="%temp%\Wgettemp"  
22.
if defined typ set "Typ=-A %typ%"  
23.
echo Teste Server ...  
24.
 
25.
(wget --ftp_user=ftpuser --ftp-password=ftppassword --spider  %server% -nv -nd) 2>&1 |find "]" >nul &&echo Erfolgreich.||echo Serverfehler.&& echo(&&  
26.
 
27.
(wget --spider  %server% -nv -nd &exit /b 2)   
28.
 
29.
echo Erstelle Liste des FTP-Verzeichnisses 
30.
echo dies kann einige Minuten Dauern 
31.
echo Bitte Warten ... 
32.
 
33.
(wget --spider  %server% %typ% -r -nv -nd) 2>&1 |find "]" |find /v ".listing" >%wgettemp% 
34.
>%wgetlog% (for /f "usebackq tokens=4" %%i in (%wgettemp%) do @echo %%l) 
35.
 
36.
echo Verzeichnissliste vom Server wurde erstellt. 
37.
echo Vergleiche CSV mit Verzeichnissen. 
38.
 
39.
for /f "usebackq delims=" %%i in (%InCSVList%) do set "Line=%%i" & call :search 
40.
goto :weiter 
41.
:search 
42.
set "Line= %Line:;=; %" 
43.
for /f "tokens=1-22*delims=;" %%a in ("%Line%") do ( 
44.
  set "Name=%%b" 
45.
  set "Part1=%%a;%%b;%%c;%%d;%%e;%%f;%%g;%%h;%%i;%%j;%%k;%%l;%%m;%%n;%%o;%%p;%%q;%%r;%%s;%%t;%%u;" 
46.
  set "Part3=;%%w" 
47.
  call :write  
48.
49.
exit /b 
50.
 
51.
:write 
52.
set "Part2=%Name:; =;%" 
53.
set "URL="http://www.coxx.it/pictures/" 
54.
for /f "Delims=" %%i in ('findstr /e "\/%Name%...." %wgetlog% ') do set "URL=%%i" 
55.
setlocal enabledelayedexpansion 
56.
set "Line=!Part1!!URL!!Part2!!Part3!" 
57.
set "Line=!Line:* =!" 
58.
set "Line=!Line:; =;!" 
59.
>>%OutCSVList% echo !Line! 
60.
endlocal 
61.
exit /b 
62.
:weiter 
63.
echo CSV Fertiggestellt. 
64.
exit /b 0
Die Ausgabedatei sieht wie folgt aus:

"XTSOL";"PCS719719";"2";"0";"1";"default";"NINTENDO";"0";"132.47";"";"";"";"1";"1";"";"0045496443597";"0.00";"default";"0";"0";"0.0000";"http://www.coxx.it/pictures/" "PCS719719";"";"";"";"";"";"";"";"";"Nintendo DSi Grundgerät schwarz";"";"Nintendo DSi Grundgerät schwarz";"";"";"";"";"";"Spielkonsolen";"";"";"";"";""


"http://www.coxx.it/pictures/" "PCS719719" müsste so aussehen: "http://www.coxx.it/pictures/PCS719719.jpg"

Und es sollte nicht nur die eine Zeile bearbeitet werden sondern die gesamte csv Datei.

Gibt es noch Tips?
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Wert in einer TXT Datei suchen (11)

Frage von nolle99 zum Thema Batch & Shell ...

VB for Applications
gelöst Mit VBA im Monatskalender Datum suchen - aus anderer Datei einfügen (6)

Frage von Otto1699 zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (32)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...