Batch Bestimmte Zeichen aus CSV Spalte löschen

syce

Cadet 1st Year
Registriert
Aug. 2018
Beiträge
12
Guten Abend miteinander und ein frohes neues Jahr! ,

hatte vor einiger Zeit mal eine Anfrage für ein Suchen Ersetzen Script via Batch gestellt, allerdings hat dieses die gesamte CSV geändert, allerdings möchte ich die Änderungen lediglich in einer bestimmten Spalte (C bzw. 3) geändert haben.. Kann man das mit einer Batch überhaupt realisieren ? Habe gelesen mit tokens und delim könnte es gehen, aber leider kenn ich mich da nicht so gut aus. So sieht mein Script bisher aus:

Bash:
@echo off
SETLOCAL enabledelayedexpansion

REM Pfad zur Quell-Datei
SET "quell_datei=bestand_real_edit.csv"

REM Pfad zur Ziel-Datei
SET "ziel_datei=bestand_real_final.csv"

REM diese Zeichenfolge wird gesucht : Kommata
SET "suchen_nach=,"

REM Funde werden ersetzt durch : nix / überschrieben / Komma wird entfernt
SET "ersetzen_durch="

REM Hinweis wenn suchen_nach nicht gesetzt wurde
IF NOT DEFINED suchen_nach (ECHO Fehler: Die Variable suchen_nach nicht definiert^^!&GOTO :eof)

REM Loeschen der Zieldatei, falls diese schon vorhanden ist
IF EXIST %ziel_datei% (DEL /f %ziel_datei% 1>NUL 2>NUL)


REM Quelldatei zeilenweise auslesen und in Variable "zeile" schreiben
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (
SET zeile=%%i& CALL :ersetzen !zeile!
)
GOTO :weiter

:ersetzen
REM Inhalt von 'suchen_nach' suchen + "ersetzen_durch" durchführen
SET zeile=!zeile:%suchen_nach%=%ersetzen_durch%!

REM Inhalt der Variable "zeile" in die Ausgabedatei schreiben
IF [!zeile!] EQU [] (ECHO.>>%ziel_datei%) ELSE (ECHO !zeile!>>%ziel_datei%)
GOTO :eof

Danke euch im Voraus für eine Hilfestellung, ich verzweifle da noch :-D
Möglich wäre laut Netz auch VBScript?

Viele Grüße

Syce
 
Würd’s ehrlich gesagt mit Libre Office Calc / Excel aufmachen und einfach die Spalte löschen. Nützt natürlich nur, wenn es was Einmaliges ist und nicht in einer Kette von anderen automatisierten Aufgaben.
 
@DeusoftheWired dein ernst? Das wird schon seinen Sinn (bspw. Automatisierung von etwa) haben wieso er das per Batch löschen möchte...
 
@DubZ Deswegen ja die Einschränkung im zweiten Satz. Und du glaubst gar nicht, mit welchen Mitteln die Leute hier manchmal Dinge erreichen wollen.
 
Guten Morgen,

tatsächlich geht es mir darum, den Vorgang zu automatisieren, da diese Datei für eine Schnittstelle einmal Pro Stunde hochgeladen und verarbeitet wird. Diese Spalte darf kein Komma beinhalten, da die Schnittstelle Preise im Format 1111 und nicht 11,11 € verarbeitet (seltsamerweise).

Viele Grüße
 
Eine Frage, stellvertretend mal hier in den Raum geworfen, kann man aber eigendlich fuer alle Batch Fragen der letzten Jahre stellen...
Warum die veraltete Batch? Powershell ist seit vielen Jahren auf allen Microsoft Systemen vorhanden (und wenn nicht kann einfach nachinstalliert/geupdatet werden) und ist einfach nur unglaublich viel maechtiger als Batch. Powershell ist im Endeffekt eine vollstaendige Programmiersprache, die das was du willst garantiert kann.

Zum Thema: ich gehe davon aus, das "," auch der Delimiter der CSV Datei ist? Dann waere jedenfalls klar warum das Komma aus der Zelle raus muss ;)
Hast du irgendeinen Einfluss auf die Erstellung der CSV Datei?
Sind Anfuehrungszeichen um den Betrag in der Rohdatei? Wenn ja, kann man damit arbeiten.
Ist das Eurozeichen in den Rohdaten? Damit kann man evtl. auch arbeiten. Stichwort nach dem Eurozeichen suchen, drei zeichen nach links...
Ist das Format immer x(...)x,yy und die Zahl der Spalten immer die gleiche? Dann kann man vielleicht die Kommas zaehlen um zur richtigen Spalte zu kommen.

Das sollen Ansatzpunkte sein mit denen man vielleicht was erreichen kann. Die Umsetzung ueberlasse ich dir ;)
 
  • Gefällt mir
Reaktionen: RalphS
syce schrieb:
tatsächlich geht es mir darum, den Vorgang zu automatisieren

Okay. Schau dir mal diesen Fall bei SO an. Dort soll in der fünften, sechsten, siebenten und achten Spalte ein Punkt gegen ein Komma ersetzt werden. Gelöst wurde das ganze mit awk.
 
Hallo Ranayna,

nein der Delimiter ist tatsächlich kein Komma, sondern Semikolongetrennt. Das Komma soll aus der 3. Spalte raus weil wie bereits erwähnt die Preise nicht mit Komma getrennt werden sollen, mein Export aber nicht ohne Komma möglich ist.

Die Powershell wäre auch eine Variante, jedoch kenne ich mich da noch weniger aus und kann damit ergo gar nichts anfangen. Daher brauche ich ja Hilfe :-)
 
Sich die Powershell mal anzuschauen ist sehr empfehlenswert wenn man seinen Schwerpunkt in der Windowswelt hat.
Mal in den Raum geworfen:
https://www.windowspro.de/script/csv-dateien-powershell-erstellen-sortieren-filtern
Damit kann man die CSV importieren und die Spalte raussuchen, dann mit foreach die Elemente durchgehen und das Komma entfernen, und anschliessend zurueckschreiben.

Allerdings kann man ja inzwischen durch das Linux Subsystem auch viele Tools aus der Linuxwelt auch unter Windows gut verwenden, so dass die Loesung die @DeusoftheWired verlinkt hat bei installierten Subsystem evtl. sogar eins zu eins uebernommen werden kann. Allerdings habe ich noch keine eigene Erfahrung mit dem Systemsystem gemacht.
Wenn der Delimiter kein Komma ist, muss man jedenfalls nicht wild herumdoktorn und sollte schnell zu einer Loesung kommen koennen.
 
  • Gefällt mir
Reaktionen: RalphS
Hallo und danke für die ausführliche Antwort. Ich versuche noch rauszufinden wie ich das Script vervollständige da ich mich nicht so gut damit auskenne.

Mein fortschritt bislang:

Import-Csv -Path '.\count_export.csv' | select count

Im Prinzip bräuchte ich doch jetzt eine Forschleife welche durchzählt und bei bestimmten Einträgen das Komma ersetzt ?
 
Zuletzt bearbeitet:
Stichwort fuer die Syntaxssuche: powershell foreach
Mit foreach kannst du durch alle Elemente laufen, ohne das dich interessieren muss vielviele du da eigendlich grade hast.

Bitte deinen Tippfehler korrigieren, die Schleife die du meinst ist eine "for" und keine "vor" Schleife. Ist immer alles englisch beim programmieren. ;)
Eine For Schleife geht natuerlich auch, aber da musst du dann halt schauen wieoft du durchlaufen willst, bzw wann du rausbrichst. Foreach ist da einfacher.
 
  • Gefällt mir
Reaktionen: DeusoftheWired
Uff peinlich, ich weiß schon dass das Forschleife heißt aber vermutlich hab mich da einfach im Eifer des Gefechts verschrieben ;-) Ganz unbekannt ist mir das Terrain nicht.
 
Dennoch komme ich nicht wirklich weiter. Mein Script sieht bislang so aus:
(Get-Content S:\JTL\10_Exports\bestand_real_edit.csv) | $Object = New-Object -TypeName PSObject %{if($_ -match '(".*),(.*")'){$_ -replace $matches[0],($matches[1]+' '+$matches[2]);$_}} $Object | Export-Csv S:\JTL\10_Exports\bestand_real_edit_final.csv

Kennt sich damit jemand aus ? Leider kann ich mit den Fehlermeldungen in der PS nicht viel anfangen

Gruß und Danke..
 
Welche Fehlermeldungen gibt es denn?
Und als Anregung, bevor man versucht sowas ueber Pipes in einen Einzeiler zu quetschen: Powershellscripts duerfen gerne ueber mehrere Zeilen gehen ;) das macht es deutlich uebersichtlicher und einfacher zu debuggen, und zur Runtime ists meistens irrelevant wie lang das Script ist.
Man kann ja wie in normalen Programiersprachen mit Variablen arbeiten.
 
Zurück
Oben