Per Batch Datei .csv Tabelle beschreiben und auslesen?
Hallo und guten Abend! =)
Ich habe eine Batch Datei erstellt, die einfach kleinere Datensätze in eine .csv Tabelle einträgt. Dazu habe ich eine Abfrage formuliert, die aus der jeweiligen Eingabe dann eine Variabel erstellt. Ich habe versucht mittels echo und type Befehl diese in meine .csv Datei einzutragen, jedoch stehen die im Endeffekt untereinander.
Letztendlich soll die Tabelle Datensätze zu Produkten beinhalten, also EAN, Name, Preis etc.
So klappts jedenfalls nicht:
set /p "service.ean.in=Barcode Scannen : "
echo %service.ean.in%>>c:\solid.csv
set /p "service.name.in=Name einfügen : "
echo %service.name.in%>>c:\solid.csv
set /p "service.price.in=Preis eingeben : "
echo %service.price.in%>>c:\solid.csv
set /p "service.link.in=Link einfügen : "
echo %service.link.in%>>c:\solid.csv
Irgendwelche Tipps? =)
Und wie kann ich nach zb einer EAN per Batch eingabe suchen, sodass er mir die Daten dann in der Batch anzeigt?
2 Antworten
@echo off
chcp 65001 >nul
setlocal enableDelayedExpansion
:inputLoop
rem defaultwerte für %Input.variablen% (falls der nutzer nur Enter drückt.) Batch mag beim auflösen von CSV keine leeren Felder
for %%a in ("EAN" , "ASIN" , "Name" , "Preis") do (set "Input.%%~a=n/a")
set "Datensatz="
for %%a in ("EAN","ASIN","Name","Preis") do (
set /p Input.%%~a="%%~a eingeben:"
)
set "Datensatz=%Input.EAN%;%Input.ASIN%;%Input.Name%;%Input.Preis%"
echo %Datensatz%
rem in Datei schreiben
>>"Mein.csv" echo %Datensatz%
choice /m "Noch eien Datensatz eingeben?"
if %errorlevel% equ 1 goto :inputloop
set /p search.EAN="nach welcher EAN willst Du suchen?:"
rem cvs-Datei in Token auflösen (feldtrenner=;)
for /f "useback tokens=1-4 delims=;" %%a in ("Mein.csv") do (
if "%%~a"=="%search.EAN%" (
echo Datensatz gefunden:
for %%. in ("EAN=%%~a" ; "ASIN=%%~b" ; "Name=%%~c" ; "Preis=%%~d") do (
echo %%.
)
)
)
So einfach der Ansatz auch sein mag mit Findstr einfach stumpf die Datei abzusuchen, es ist einfach zu grob.
Besser ist es die Datensätze aufzulösen und zu prüfen ob das gesuchte im gewünschten Feld passt.
Nebenbei siehst Du auch wie man sich widerholende Sachen mit for erledigt.
Ich habe keine Ahnung was Du da versuchst zu zaubern...?
Du liest jeweils die erste Eile aus den Dateien "%appdata%\font.csv" und "%appdata%\bg.csv".
Natürlich weiß ich nicht was da drin steht, und warum Du die besagten Dateien als .csv ausgibst? ( https://de.wikipedia.org/wiki/CSV_(Dateiformat) )
und warum versuchst Du einen Font zuzuweisen? Die Windowsconsole (cmd) arbeitet mit einem voreingestelltem Font , welcher zur Ausführungszeit nicht geändert werden kann.
bezüglich des Leerzeichens zwischen den Farbtokens für color habe ich einen verdacht.
Du hast garantiert folgendes getan um die 1 in die Datei "%appdata%\bg.csv" (die kein csv ist) zu schreiben:
echo 1 >"%appdata%\bg.csv" %=gibt 1Leerzeichen aus=%
...damit hast Du auch das Leerzeichen nach der 1 "verkauft" ,...und wieder eingelesen😱.
folgendes geht natürlich auch nicht, da alleinstehende Ziffern vor dem Redirector">" als Handle gewertet werden.
echo 1>"%appdata%\bg.csv" %=geht nicht=%
du hast 2 Möglichkeiten um das Szenario zu fixen:
>"%appdata%\bg.csv" echo 1
(echo 1)>"%appdata%\bg.csv"
Wenn du nicht gerade etwas mit Klammer Ausgeben möchtest ist das einfassen mit einer Klammer die sicherste Methode um unerwünschten Kram zu entdecken.
Natürlich ist es absoluter Schwachsinn jede Variable in eien eigenne Configurationsdatei zu speichen. Das geht viel einfacher und mit einer Datei für alle Variablen:
Auf Deine Variablen gemünzt (das mit dem Font kannst Du vergessen):
@echo off
chcp 65001 >nul
rem variablen, welche gespeichert und gelesen werden sollen
set "service.VordergrundFarbe=f"
set "service.HintergrundFarbe=1"
set "myFile=test.ini"
rem schreibe alle variablen welche mit service. beginnen in Datei
set "service." >"%myFile%"
echo das wurde gespeichert:
type "%myFile%"
echo:
rem lösche alle Variablen welche mit service. beginnen
for /f "tokens=1 delims==" %%a in ('set "service."') do (set "%%a=")
rem mal schauen ob sie weg sind...
set "service." ||(echo Die sind dann wohl erstmal weg XD !&echo:)
rem lies alle Variablen aus Datei wieder ein...
for /f "usebackq tokens=*" %%a in ("%myFile%") do (set "%%a")
rem mal schauen ob sie wieder da sind sind...
echo die habe ich wieder eingelesen:
set "service."
echo:
pause
so einfach geht das...😅 mit jeweils einer Zeile Schreibt , Liest, Löscht man Variablengruppen .
Was Du da mit den if machst, muss ich wohl nicht verstehen. (warum erst die Abfrage, wenn Du dann ohnehin die passende Farbe setzt...
(bezogen auf das vorangegangen Script und die gespeicherte ini.-Datei)
@echo off
set "myFile=test.ini"
rem variablen aus Datei lesen.
for /f "usebackq tokens=*" %%a in ("%myFile%") do (set "%%a")
rem farbe setzen (ohne irgendwelches if-Gefummel)
color %service.HintergrundFarbe%%service.VordergrundFarbe%
echo na geht doch!!
pause
...also, nix mit verändern des Fonts... (als Anfänger solltest Du auch nicht versuchen per Batch irgendwelche Einstellungen an der Console zu machen. Dazu musst Du die Registry manipulieren und das kann bitter ins Auge gehen, wenn Du nicht absolut sattelfest in Batch bist.)
Bevor Du Dich mit irgendwelchen Ausschmückungen beschäftigst, solltest Du erstmal die Arbeit mit Variablen , Ausgabeumleitungen und vor allem for-Loops im Schlaf beherrschen.
Dein spagetticode:
set "variable=3"
if "%variable%"=="1" echo deine variable ist 1
if "%variable%"=="2" echo deine variable ist 2
if "%variable%"=="3" echo deine variable ist 3
if "%variable%"=="4" echo deine variable ist 4
if "%variable%"=="5" echo deine variable ist 5
if "%variable%"=="6" echo deine variable ist 6
...sähe bei mir so aus:
set "variable=3"
for /l %%a in (1,1,6) do (
if "%variable%"=="%%a" echo deine variable ist %%a
)
schau dir die Ausführung ruhig mal ohne echo off an, damit Du siehst was da passiert. Da kannst du auch 100000 IFs abarbeiten. Außerdem ist es schnell (Batch liest normalerweise ziele für Zeile aus der .cmd-Datei und interpretiert diese Zeile. Bei for-loops wird dieser komplett geladen und alles was im do (Body) ist, wird im Speicher ausgeführt ohne erneut aus der Datei zu lesen (ausgenommen call :label))
Etwas Variablenmanipulation kann auch nix schaden:
set "variable= 3 "
echo ###%variable%###
rem lösche alle leerzeichen in der variable
set "variable=%variable: =%"
echo ###%variable%###
Weil das, was Du tust, immer eine Zeile schreibt.
Willst Du mehrere Inhalt in einer Zeile haben, musst Du dir die Zeile vorher in einer Variable zusammenbauen.
Und Auslesen ist so ein Thema. Möglich ist es, die for-Schleife sollte die nötigen Funktionen mit bringen, allerdings ist das wahrscheinlich ein einziges unleserliches Chaos.
Was auch immer Du vor hast - greif lieber auf eine richtige Programmiersprache zurück, das ist bedeutend einfacher.
Ja ich weiß, dass es da bessere Sprachen zur Umsetzung gibt, leider habe ich großes Gefallen an Batch gefunden und freue mich dementsprechend immer, wenn etwas klappt.
Wie müsste ich solch eine Variable denn angehen?
Joa, an der Stelle war ich auch mal - hab nie bereut, doch noch mit C# angefangen zu haben.
set "a=1"
set "b=2"
set "c=%a%%b%"
echo %c%
Okay ich habe es endlich hinbekommen.. :D
Nun mache ich mich mal an die Abfrage.
Ich werde mich wohl ma in die for Funktion einlesen^^
Danke^^
Ich habe es nun so hinbekommen, dass ich nach etwas suchen kann und mir dafür aus der jeweiligen zeile die erste spalte angezeigt wird, wie kann ich den Datensatz denn komplett anzeigen lassen, zB.
EAN:
ASIN:
Name:
Preis:
So siehts bislang aus:
:SERVICE.DATA.OU
cls
title Datensuche
set /p "Suchbegriff=Produkt scannen : "
for /f "delims=;" %%i in ('findstr /ic:";%Suchbegriff%" "c:\solid.csv"') do set "Ergebnis=%%i"
echo Datensatz gefunden:
echo %Ergebnis%
pause
Oh vielen Dank, damit hast du mich ein ganzes stück weitergebracht! :3
Ich habe gerade noch ein Menü eingebaut um die Farben zu ändern, sodass er diese auch speichert. Jedoch hakt es da gewaltig, so macht er garnichts
set /p service.font= < %appdata%\font.csv
set /p service.bg= < %appdata%\bg.csv
if "%service.bg%"=="1 " color 1%service.font%
if "%service.bg%"=="2 " color 2%service.font%
if "%service.bg%"=="3 " color 3%service.font%
if "%service.bg%"=="4 " color 4%service.font%
if "%service.bg%"=="5 " color 5%service.font%
if "%service.bg%"=="6 " color 6%service.font%
und wenn ich einfach color %service.bg%%service.font%
eingebe zeigt er mir anfangs die color hilfe an, zumal er die auswahl auch mit einem leerzeichen danach abspeichert, mit echo %service.bg%%service.font%
gibt er mit dann nur zb 1 F anstatt 1F aus.