Per Batch Datei .csv Tabelle beschreiben und auslesen?

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.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
Strumpfhouse 
Fragesteller
 12.05.2021, 10:16

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.

0
Erzesel  12.05.2021, 17:52
@Strumpfhouse

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%###
0

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.

Strumpfhouse 
Fragesteller
 09.05.2021, 21:12

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?

0
Palladin007  09.05.2021, 21:18
@Strumpfhouse

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%
0
Strumpfhouse 
Fragesteller
 09.05.2021, 22:13
@Palladin007

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^^

1
Strumpfhouse 
Fragesteller
 09.05.2021, 22:32
@Palladin007

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

0