kariya
Goto Top

Datei suchen und Dateiname in CSV einfügen

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.

Content-Key: 188336

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

Printed on: April 19, 2024 at 16:04 o'clock

Member: pieh-ejdsch
pieh-ejdsch Jul 20, 2012 at 18:30:27 (UTC)
Goto Top
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
Member: Kariya
Kariya Jul 23, 2012 at 15:56:55 (UTC)
Goto Top
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
Member: pieh-ejdsch
pieh-ejdsch Jul 24, 2012, updated at Aug 09, 2012 at 17:04:47 (UTC)
Goto Top
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.

@echo off
setlocal

 rem nur den Pfad zur wget.exe angeben
set "wgetPath=D:\wsusoffline\bin\"  
set "Server=ftp://ftp.freenet.de/debian/"  

 rem InklusiveListe Dateiendung Trennung mit Komma
 rem bei allen Dateien nichts angeben
set "Typ=bmp,jpg"  
set InCSVList="D:\test\IN.txt"  
set OutCSVList="D:\test\Out.txt"  
type nul>%OutCSVList%

 rem wget in Path eintragen
(echo ;%path:;=;&echo(;%;)|find /i ";%wgetpath%;" >nul || set "path=%path%;%wgetpath%"  
 rem prüfe ob wget gefunden
(wget) 2>&1 |findstr /n "Befehl nicht" &&echo(&&echo wget.exe nicht gefunden. Bitte Pfad angeben!&& exit /b 1  

set Wgetlog="%temp%\Wget.log"  
set Wgettemp="%temp%\Wgettemp"  
if defined typ set "Typ=-A %typ%"  
echo Teste Server ...
(wget --spider  %server% -nv -nd) 2>&1 |find "]" >nul &&echo Erfolgreich.||echo Serverfehler.&& echo(&& (wget --spider  %server% -nv -nd &exit /b 2)   

echo Erstelle Liste des FTP-Verzeichnisses
echo dies kann einige Minuten Dauern
echo Bitte Warten ...

(wget --spider  %server% %typ% -r -nv -nd) 2>&1 |find "]" |find /v ".listing" >%wgettemp%  
>%wgetlog% (for /f "usebackq tokens=4" %%i in (%wgettemp%) do @echo %%l)  

echo Verzeichnissliste vom Server wurde erstellt.
echo Vergleiche CSV mit Verzeichnissen.

for /f "usebackq delims=" %%i in (%InCSVList%) do set "Line=%%i" & call :search  
goto :weiter
:search
set "Line= %Line:;=; %"  
for /f "tokens=1-22*delims=;" %%a in ("%Line%") do (  
  set "Name=%%b"  
  set "Part1=%%a;%%b;%%c;%%d;%%e;%%f;%%g;%%h;%%i;%%j;%%k;%%l;%%m;%%n;%%o;%%p;%%q;%%r;%%s;%%t;%%u;"  
  set "Part3=;%%w"  
  call :write 
)
exit /b
:write
set "Name=%Name:; =;%"  
set "URL="  
for /f "Delims=" %%i in ('findstr /e "\/%Name%...." %wgetlog% ') do set "URL=%%i"  
setlocal enabledelayedexpansion
set "Line=!Part1!!URL!!Part2!"  
set "Line=!Line:* =!"  
set "Line=!Line:; =;!"  
>>%OutCSVList% echo !Line!
endlocal
exit /b
:weiter
echo CSV Fertiggestellt.
exit /b 0


Gruß Phil
Member: pieh-ejdsch
pieh-ejdsch Jul 29, 2012 at 21:46:29 (UTC)
Goto Top
moin,

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

Gruß Phil
Member: Kariya
Kariya Jul 31, 2012, updated at Aug 07, 2012 at 15:54:58 (UTC)
Goto Top
So ich hab das ganze nochmal getestet leider noch funktioniert das ganze noch nicht zu 100%.

Mein Quelltext sieht wie folgt aus:

@echo off 
setlocal 

  rem nur den Pfad zur wget.exe angeben 
set "wgetPath=C:\Programme\GnuWin32\bin\"   
set "Server=ftp://FTP.Server"   

 rem InklusiveListe Dateiendung Trennung mit Komma 
 rem bei allen Dateien nichts angeben 
set "Typ=bmp,jpg"   
set InCSVList="E:\test\modified_01.csv"   
set OutCSVList="E:\test\modified.csv"   
type nul>%OutCSVList% 

 rem wget in Path eintragen 
(echo %path:;=&echo(%)|find /i "wget.exe" >nul || set "path=%path%;%wgetpath%"   
 rem prüfe ob wget gefunden
(wget) 2>&1 |findstr /n "Befehl nicht" &&echo(&&echo wget.exe nicht gefunden. Bitte Pfad angeben!&& exit /b 1   

set Wgetlog="%temp%\Wget.log"   
set Wgettemp="%temp%\Wgettemp"   
if defined typ set "Typ=-A %typ%"   
echo Teste Server ... 

(wget --ftp_user=user --ftp-password=password --spider  %server% -nv -nd) 2>&1 |find "]" >nul &&echo   

Erfolgreich.||echo Serverfehler.&& echo(&& (wget --spider  %server% -nv -nd &exit /b 2)  


echo Erstelle Liste des FTP-Verzeichnisses 
echo dies kann einige Minuten Dauern 
echo Bitte Warten ... 

(wget --spider  %server% %typ% -r -nv -nd) 2>&1 |find "]" |find /v ".listing" >%wgettemp%  
>%wgetlog% (for /f "usebackq tokens=4" %%i in (%wgettemp%) do @echo %%l)  

echo Verzeichnissliste vom Server wurde erstellt. 
echo Vergleiche CSV mit Verzeichnissen. 

for /f "usebackq delims=" %%i in (%InCSVList%) do set "Line=%%i" & call :search   
goto :weiter 
:search
set "Line= %Line:;=; %"  
for /f "tokens=1-22*delims=;" %%a in ("%Line%") do (   
  set "Name=%%b"   
  set "Part1=%%a;%%b;%%c;%%d;%%e;%%f;%%g;%%h;%%i;%%j;%%k;%%l;%%m;%%n;%%o;%%p;%%q;%%r;%%s;%%t;%%u;"   
  set "Part3=;%%w"   
  call :write  
) 
exit /b 
:write 
set "Name=%Name:; =;%"   
set "URL="http://www.coxx.it/pictures/""   
for /f "Delims=" %%i in ('findstr /e "\/%Name%...." %wgetlog% ') do set "URL=%%i"   
setlocal enabledelayedexpansion 
set "Line=!Part1!!URL!!Part2!"   
set "Line=!Line:* =!"   
set "Line=!Line:; =;!"   
>>%OutCSVList% echo !Line! 
endlocal 
exit /b 
:weiter 
echo CSV Fertiggestellt. 
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?
Member: Kariya
Kariya Aug 08, 2012 updated at 20:35:59 (UTC)
Goto Top
Ich habe in den letzten Tagen selbst noch ein wenig probiert, bin aber leider auf keinen grünen Zweig gekommen.

@echo off 
setlocal 

  rem nur den Pfad zur wget.exe angeben 
set "wgetPath=C:\Programme\GnuWin32\bin\"   
set "Server=ftp://coxx.it"   

 rem InklusiveListe Dateiendung Trennung mit Komma 
 rem bei allen Dateien nichts angeben 
set "Typ=bmp,jpg"   
set InCSVList="E:\test\modified_01.csv"   
set OutCSVList="E:\test\modified.csv"   
type nul>%OutCSVList% 

 rem wget in Path eintragen 
(echo %path:;=&echo(%)|find /i "wget.exe" >nul || set "path=%path%;%wgetpath%"   
 rem prüfe ob wget gefunden
(wget) 2>&1 |findstr /n "Befehl nicht" &&echo(&&echo wget.exe nicht gefunden. Bitte Pfad angeben!&& exit /b 1   

set Wgetlog="%temp%\Wget.log"   
set Wgettemp="%temp%\Wgettemp"   
if defined typ set "Typ=-A %typ%"   
echo Teste Server ... 

(wget --ftp_user=ftpuser --ftp-password=ftppassword --spider  %server% -nv -nd) 2>&1 |find "]" >nul &&echo Erfolgreich.||echo Serverfehler.&& echo(&&   

(wget --spider  %server% -nv -nd &exit /b 2)  

echo Erstelle Liste des FTP-Verzeichnisses
echo dies kann einige Minuten Dauern
echo Bitte Warten ...

(wget --spider  %server% %typ% -r -nv -nd) 2>&1 |find "]" |find /v ".listing" >%wgettemp%  
>%wgetlog% (for /f "usebackq tokens=4" %%i in (%wgettemp%) do @echo %%l)  

echo Verzeichnissliste vom Server wurde erstellt.
echo Vergleiche CSV mit Verzeichnissen.

for /f "usebackq delims=" %%i in (%InCSVList%) do set "Line=%%i" & call :search  
goto :weiter
:search
set "Line= %Line:;=; %"  
for /f "tokens=1-22*delims=;" %%a in ("%Line%") do (  
  set "Name=%%b"  
  set "Part1=%%a;%%b;%%c;%%d;%%e;%%f;%%g;%%h;%%i;%%j;%%k;%%l;%%m;%%n;%%o;%%p;%%q;%%r;%%s;%%t;%%u;"  
  set "Part3=;%%w"  
  call :write 
)
exit /b

:write
set "Part2=%Name:; =;%"  
set "URL="http://www.coxx.it/pictures/"  
for /f "Delims=" %%i in ('findstr /e "\/%Name%...." %wgetlog% ') do set "URL=%%i"  
setlocal enabledelayedexpansion
set "Line=!Part1!!URL!!Part2!!Part3!"  
set "Line=!Line:* =!"  
set "Line=!Line:; =;!"  
>>%OutCSVList% echo !Line!
endlocal
exit /b
:weiter
echo CSV Fertiggestellt.
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?