Eine .csv nach einem Wert dursuchen, der Zeilenbasiert immer an derselben Stelle steht und diesen dann ändern
Hallo,
bin ganz frisch hier und habe einige Threads hier schon durchsucht ohne meine Batch selbst hinzubekommen. Daher würde ich mich über eure Hilfe freuen!
Wie der Titel verrät habe ich eine .csv Datei. In dieser befindet sich eine Tabelle mit Überschriften und dann Zeilen und Spalten, es wird ";" als Trennzeichen verwendet - die Datei sieht also ungefähr so aus:
Mein Ziel ist den mit Ausrufezeichen markierten Wert zu finden und in eine String variable zu packen, die Zeile anschließend danach zu durchsuchen und den Werte durch einen zufälligen, möglichst sinnvollen(selbe alphanumerische Aufteilung) Wert zu ersetzen. Dies soll für die ganze Datei, Zeile für Zeile passieren.
Da ich bisher nur rudimentäre Batch gebastelt habe (Dienste starten/stoppen, Dateien automatischen verschieben/löschen, usw.) fehlt mir da so einiges an Wissen (C++ aus der Berufsschule hilft da fast gar nicht).
Bisher habe ich es geschafft einen Ordner zu erstellen und eine Kopie der Datei darin zu erstellen. Dann Wird gebprüft ob die Datei auch die Richtige ist und es beginnt eine FOR Schleife an der ich Scheitere:
Der Ansatz der Vorschleife ist ein Produkt aus dem Artikel. Leider bin ich nicht ganz durchgestiegen.
Generell war mein Gedanke eine verschachtelte FOR-Schleife zu bauen, bei der die erste Schleife einmal die ganze Datei durchgeht und die Zweite dann Zeile für Zeile an der richtigen Stelle (der Text zwischen dem Zweiten und dem Dritten Semikolon) prüft. Dann sollen alle gefundenen Werte ersetzt werden.
Vielen Dank schonmal im Voraus,
mIsSteR
bin ganz frisch hier und habe einige Threads hier schon durchsucht ohne meine Batch selbst hinzubekommen. Daher würde ich mich über eure Hilfe freuen!
Wie der Titel verrät habe ich eine .csv Datei. In dieser befindet sich eine Tabelle mit Überschriften und dann Zeilen und Spalten, es wird ";" als Trennzeichen verwendet - die Datei sieht also ungefähr so aus:
"ÜBERSCHRIFT1";"";"ÜBERSCHRIFT2";"ÜBERSCHRIF3";"ÜBERSCHRIFT4";"ÜBERSCHRIFT5";"ÜBERSCHRIFT6";"ÜBERSCHRIFT7";"ÜBERSCHRIFT8";"ÜBERSCHRIFT9";"ÜBERSCHRIFT10";"ÜBERSCHRIFT11"
"12341234";"19.05.17 00:00:00";"!AB12CDE12345687641414!";"BLA";"0200001";"SHDSHD22XXX";"Lorem Ipsum";"Actual";"Look";"Werte";"Wasauchimmer";"AB12CDE12345687641414"
"33444";"19.05.17 00:00:00";"AB12CDE12345687641414";"Bla BLA";"0200001";"SHDSHD22XXX";"Lorem Ipsum";"Actual";"Look";"Werte";"Wasauchimmer";"AB12CDE12345687641414"
Mein Ziel ist den mit Ausrufezeichen markierten Wert zu finden und in eine String variable zu packen, die Zeile anschließend danach zu durchsuchen und den Werte durch einen zufälligen, möglichst sinnvollen(selbe alphanumerische Aufteilung) Wert zu ersetzen. Dies soll für die ganze Datei, Zeile für Zeile passieren.
Da ich bisher nur rudimentäre Batch gebastelt habe (Dienste starten/stoppen, Dateien automatischen verschieben/löschen, usw.) fehlt mir da so einiges an Wissen (C++ aus der Berufsschule hilft da fast gar nicht).
Bisher habe ich es geschafft einen Ordner zu erstellen und eine Kopie der Datei darin zu erstellen. Dann Wird gebprüft ob die Datei auch die Richtige ist und es beginnt eine FOR Schleife an der ich Scheitere:
@echo off & setlocal
REM Declare variables
set counter=0
set strvar=test
set path="C:\tmpcache\Dateiname.csv"
REM Create a cache an copy the folder
mkdir C:\tmpcache
copy /-y C:\Tmp_Analytics C:\tmpcache
REM Check the file to assure the content is correct
find "VALUE" "C:\tmpcache\Dateiname.csv"
IF errorlevel 1 (
echo Falsche Datei.
) ELSE (
echo Richtige Datei.
)
(for %%f in ("C:\tmpcache\*.csv") do (
type "%%~f" | find ";" > NUL && (
echo %%~f
)
))
REM delete the cached file
del %path%
pause
Der Ansatz der Vorschleife ist ein Produkt aus dem Artikel. Leider bin ich nicht ganz durchgestiegen.
Generell war mein Gedanke eine verschachtelte FOR-Schleife zu bauen, bei der die erste Schleife einmal die ganze Datei durchgeht und die Zweite dann Zeile für Zeile an der richtigen Stelle (der Text zwischen dem Zweiten und dem Dritten Semikolon) prüft. Dann sollen alle gefundenen Werte ersetzt werden.
Vielen Dank schonmal im Voraus,
mIsSteR
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 344401
Url: https://administrator.de/forum/eine-csv-nach-einem-wert-dursuchen-der-zeilenbasiert-immer-an-derselben-stelle-steht-und-diesen-dann-aendern-344401.html
Ausgedruckt am: 04.05.2025 um 15:05 Uhr
13 Kommentare
Neuester Kommentar

@echo off
powershell -ExecutionPolicy ByPass -Command "(gc 'C:\tmpcache\Dateiname.csv') -replace '!AB12CDE12345687641414!','WhateverReplacement' | sc 'C:\tmpcache\Dateiname.csv'"

Zitat von @mIsSteR:
Wenn ich deinen Ansatz richtig verstehe, muss ich davor noch irgendwie herausfinden wie der String an dieser Stelle heißt
Du schreibst ja oben leider nirgendwo das du ihn nicht kennst. Aber wenn du ihn nicht kennst, auch kein Problem, bisschen Regex eingestreut geht natürlich auch dasWenn ich deinen Ansatz richtig verstehe, muss ich davor noch irgendwie herausfinden wie der String an dieser Stelle heißt
powershell -ExecutionPolicy ByPass -Command "(gc 'C:\tmpcache\Dateiname.csv') -replace '![^!]+!','WhateverReplacement' | sc 'C:\tmpcache\Dateiname.csv'"

replace auszuführen - und zwar den Wert '![!]+!' durch 'WhateverReplacement' in der Datei
Ja nee, schau dir den Pattern noch mal genau an !!! Du hast das essentielle ^ einfach weg gelassen ohne zu wissen was du damit anrichtest Funktioniert einwandfrei.

Quell-Datei sieht so aus:
Nach Anwenden von
sieht sie die gleiche Datei so aus
Also der String !AB12CDE12345687641414! der mit führendem und abschließendem Ausrufezeichen gesucht wurde ersetzt durch WhateverReplacement. Also alles i.O.
Der Regex besagt: Suche einen String mit einem Ausrufezeichen am Anfang und am Ende und dazwischen egal welches Zeichne außer einem Ausrufezeichen mindestens 1mal.
k.A. was du sonst willst, oder du beschreibst es falsch...
"ÜBERSCHRIFT1";"";"ÜBERSCHRIFT2";"ÜBERSCHRIF3";"ÜBERSCHRIFT4";"ÜBERSCHRIFT5";"ÜBERSCHRIFT6";"ÜBERSCHRIFT7";"ÜBERSCHRIFT8";"ÜBERSCHRIFT9";"ÜBERSCHRIFT10";"ÜBERSCHRIFT11"
"12341234";"19.05.17 00:00:00";"!AB12CDE12345687641414!";"BLA";"0200001";"SHDSHD22XXX";"Lorem Ipsum";"Actual";"Look";"Werte";"Wasauchimmer";"AB12CDE12345687641414"
"33444";"19.05.17 00:00:00";"AB12CDE12345687641414";"Bla BLA";"0200001";"SHDSHD22XXX";"Lorem Ipsum";"Actual";"Look";"Werte";"Wasauchimmer";"AB12CDE12345687641414"
@echo off
powershell -ExecutionPolicy ByPass -Command "(gc 'C:\test.txt') -replace '![^!]+!','WhateverReplacement' | sc 'C:\test.txt'"
"ÜBERSCHRIFT1";"";"ÜBERSCHRIFT2";"ÜBERSCHRIF3";"ÜBERSCHRIFT4";"ÜBERSCHRIFT5";"ÜBERSCHRIFT6";"ÜBERSCHRIFT7";"ÜBERSCHRIFT8";"ÜBERSCHRIFT9";"ÜBERSCHRIFT10";"ÜBERSCHRIFT11"
"12341234";"19.05.17 00:00:00";"WhateverReplacement";"BLA";"0200001";"SHDSHD22XXX";"Lorem Ipsum";"Actual";"Look";"Werte";"Wasauchimmer";"AB12CDE12345687641414"
"33444";"19.05.17 00:00:00";"AB12CDE12345687641414";"Bla BLA";"0200001";"SHDSHD22XXX";"Lorem Ipsum";"Actual";"Look";"Werte";"Wasauchimmer";"AB12CDE12345687641414"
Der Regex besagt: Suche einen String mit einem Ausrufezeichen am Anfang und am Ende und dazwischen egal welches Zeichne außer einem Ausrufezeichen mindestens 1mal.
k.A. was du sonst willst, oder du beschreibst es falsch...

OK, aber nach welchem Muster willst du denn jetzt in der dritten Spalte suchen??? Egal was Hauptsache mind. ein Buchstabe/Ziffer oder was?

Pfad in Zeile 1 und Spaltenname der IBAN in Zeile 2 anpassen.
Wurde getestet, funktioniert. Achtung überschreibt Quell-Datei, wenn nicht gewünscht bei export-csv den Pfad entsprechend abändern.
Wie man mit PS1 Dateien umgeht brauche ich hier hoffentlich nicht nochmal abhandeln.
Viel Erfolg
Ciao.
Wurde getestet, funktioniert. Achtung überschreibt Quell-Datei, wenn nicht gewünscht bei export-csv den Pfad entsprechend abändern.
$file = 'C:\Daten\datei.csv'
$colname = "ÜberschriftDerSpalte3"
$alpha = (65..90 | %{[char]$_})
$csv = Import-CSV $file -Delimiter ";"
$csv | %{
$num = $_.$colname; $row = $_
$random = [regex]::replace($num,'.',{param($m) if ($m.Value -match '[A-Z]'){$alpha | Get-Random}else{0..9 | get-random}})
$_ | gm -MemberType NoteProperty | ?{$row.($_.Name) -like "*$num*"} | %{$row.($_.Name) = $row.($_.Name) -replace $num,$random}
$row
} | export-csv $file -Delimiter ";" -NoType -Encoding UTF8
Wie man mit PS1 Dateien umgeht brauche ich hier hoffentlich nicht nochmal abhandeln.
Viel Erfolg
Ciao.