Batch Bestimmtes Zeichen aus CSV Spalte löschen

syce

Cadet 1st Year
Registriert
Aug. 2018
Beiträge
12
Guten Tag liebe Community,

ich dachte, ich wende mich an Euch, da ich ein großes Fragezeichen bei der Manipulation von CSV Dateien über eine Batch Datei habe. Ich finde einfach kein vernünftiges Tutorial, welches Klar alle Grundlagen so vermittelt, dass man auch die Syntax vernünftig gezeigt bekommt.

Vielleicht könnt ihr mir auch einen Lösungsansatz oder Snippet geben, womit ich arbeiten kann. Folgendes:

Über den Aufgabenplaner und einer Batch generiere ich täglich eine CSV mit Rechnungsdaten aus einer Warenwirtschaft heraus. Soweit so gut, aber jetzt das komplizierte. Unsere Warenwirtschaft exportiert Korrekturen von Rechnungen immer als Minusbetrag und es gibt auch keine Möglichkeit dies zu ändern, außer eben über eine Manipulation per Batch..

Ich habe mich zwar ein wenig eingelesen, kann aber noch zu wenig zu dem Thema sagen außer dass man per FOR Schleife die Aktion ausführt bis kein "-"mehr vor den Beträgen mehr existiert.

Die Tabelle wie folgt:

Code:
"Sollkonto";"Habenkonto";"Gutschriftsdatum";"Bezug Belegnummer";"Gutschriftsnummer";"Buchungstext";"Steuercode";"Umsatz";"Zahlungskonditionen";"KostenstelleHaben";"KostenträgerHaben";
"D1";"1";"06.08.2018";"TEST";"TEST";"GS";"1";"-100,32";"BEZ Kunde";"11";"111";

Hoffe wirklich, dass mir jemand behilflich sein kann :-)

Vielen Dank im Voraus

Syce
 
Nutzt ihr die Daten danach in Excel? Dann könntest du einfach mit abs() das Vorzeichen entfernen
 
qqALEXpp schrieb:
Nutzt ihr die Daten danach in Excel? Dann könntest du einfach mit abs() das Vorzeichen entfernen

Die Datei wird quasi nach dem Export in eine andere Warenwirtschaft importiert, welche das Minus nicht anerkennt :-)
 
Hatte sowas mit txt-Dateien schon mal gemacht. Habe versucht soweit es mir noch nachvollziehbar war, es zu dokumentieren. Damit werden alle Minuszeichen entfernt:
Code:
@echo off
SETLOCAL enabledelayedexpansion

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

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

REM diese Zeichenfolge wird gesucht : Minuszeichen
SET "suchen_nach=-"

REM Funde werden ersetzt durch : nix / überschrieben / Minus 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
 
  • Gefällt mir
Reaktionen: Qarrr³
ryan_blackdrago schrieb:
Hatte sowas mit txt-Dateien schon mal gemacht. Habe versucht soweit es mir noch nachvollziehbar war, es zu dokumentieren. Damit werden alle Minuszeichen entfernt:
Code:
@echo off
SETLOCAL enabledelayedexpansion

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

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

REM diese Zeichenfolge wird gesucht : Minuszeichen
SET "suchen_nach=-"

REM Funde werden ersetzt durch : nix / überschrieben / Minus 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

Vielen Dank für den Quellcode, allerdings wird die letzte Zeile nicht ausgeführt.. Bis zur Löschzeile kommt er , wenn ich das durch eine bereits bestehende Quelldatei prüfe. Er legt aber nichts neues an, geschweige denn schreibt die Variable in die Ausgabedatei
 
Gerade getestet. Die Batch macht was sie soll. Meine Rohmaterial.csv enthält beispielhaft die Bezeichnung mm (die möchte ich entfernen):
rohmaterial.gif

In meiner bereinigt.csv wie gewünscht entfernt worden:
bereinigt.gif
 
ryan_blackdrago schrieb:
Gerade getestet. Die Batch macht was sie soll. Meine Rohmaterial.csv enthält beispielhaft die Bezeichnung mm (die möchte ich entfernen):
Anhang anzeigen 702773
In meiner bereinigt.csv wie gewünscht entfernt worden:
Anhang anzeigen 702774
Okay ich hatte wohl irgendeinen Fehler drin, jetzt funktioniert es :-)

Vielen Dank für die schnelle Lösung !
 
Möchte die Lösung von @ryan_blackdrago nicht schlechtmachen, aber bitte behalt im Hinterkopf, daß das Skript nicht ein typographisches Minuszeichen vor einer Zahl löscht – was außer bei UTF-8-Kodierung der .csv sowieso unwahrscheinlich darin vorkommt –, sondern einfach jeden Bindestrich innerhalb der Datei löscht. Wenn irgendwo in den Spalten Sollkonto, Habenkonto, Gutschriftsdatum, Bezug Belegnummer, Gutschriftsnummer, Buchungstext, Steuercode, Umsatz, Zahlungskonditionen, KostenstelleHaben oder KostenträgerHaben ein Bindestrich vorkommt, wird der auch gelöscht. Ist es unmöglich, daß dort ein Bindestrich vorkommt, kannst du das Skript bedenkenlos verwenden.
 
DeusoftheWired bringt es auf den Punkt. Das Skript ersetzt einfach stupide sämtliche gesuchte Zeichen(-folgen). Daher mit den Datensätzen aufpassen.

Musste damals damit sämtliche Semikolon aus Text-Dateien entfernen. Daher auch dieser Aufbau über die ganze Datei. Da konnte man damit gefahrlos arbeiten :)

Um an eine bestimmte Stelle zu gehen, könnte man mit delim und dem Aufkommen der Semikolon arbeiten (um an der richtigen Stelle vom Datensatz zu sein). Wenn jemand Lust hat. Ich nicht ^-^
 
Vorschlag für RegEx: ^-\d*\.?\d+$ das entspricht einer negativen Zahl, also ein Bindestrich gefolgt von 0123456789.
Aber keinen Plan, wie man das in ’ne .bat einbindet. Benutze sie nur ab und zu in Notepad++. :D
 
Ja ich würde das Script nicht nutzen wenn ich nicht absolut sicher wäre, dass in den anderen Feldern kein Minus vorkommt. Aber so simpel das Script auch ist, besser als es manuell zu machen :-)

Vielleicht hat ja jemand ein Tutorial für mich, welches einfach erklärt ist und ich kann dann später meine eigene Lösung basteln
 
Zurück
Oben