In CSV Datei nur in einer Spalte Suchen, Ersetzen per Batch
Hallo,
Habe eine CSV mit Artikeldaten wo Spalte 21 den Lagerbestand enthält mit YES NO und LOW gekennzeichnet ist.
Für den Automatischen Import benötigen wir aber Zahlen. Also sollen die Buchstaben mit Zahlen ersetzt werden.
Habe nun bereits folgende Batch Datei:
jetz habe ich nur das Problem das so alle Buchstaben der Kompletten CSV geändert werden.
Es soll aber nur Spalte 21 ausgelesen und geändert werden.
Die CSV ist folgendermaßen aufgebaut
Hoffe es kann mir einer helfen.
Weiß gerade nicht wie ich das angehen sollte.
Mit freundlichen Grüßen
Remie
Habe eine CSV mit Artikeldaten wo Spalte 21 den Lagerbestand enthält mit YES NO und LOW gekennzeichnet ist.
Für den Automatischen Import benötigen wir aber Zahlen. Also sollen die Buchstaben mit Zahlen ersetzt werden.
Habe nun bereits folgende Batch Datei:
@ECHO off
SETLOCAL enabledelayedexpansion
REM Testprogramm zum Aendern von "" in "
SET quelle=C:\download\products.csv
SET ziel= C:\import\export.csv
IF EXIST %ziel% DEL /f %ziel%
FOR /f "delims=" %%i IN ('FINDSTR . %quelle%') DO (
SET ganze_zeile=%%i
SET ganze_zeile=!ganze_zeile:YES=99!
SET ganze_zeile=!ganze_zeile:NO=0!
SET ganze_zeile=!ganze_zeile:LOW=10!
ECHO !ganze_zeile!
ECHO !ganze_zeile! >> %ziel%
)
jetz habe ich nur das Problem das so alle Buchstaben der Kompletten CSV geändert werden.
Es soll aber nur Spalte 21 ausgelesen und geändert werden.
Die CSV ist folgendermaßen aufgebaut
Product Name;Country of Origin;Weight; u.s.w.
Hoffe es kann mir einer helfen.
Weiß gerade nicht wie ich das angehen sollte.
Mit freundlichen Grüßen
Remie
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 197091
Url: https://administrator.de/contentid/197091
Ausgedruckt am: 24.11.2024 um 06:11 Uhr
18 Kommentare
Neuester Kommentar
Hallo eimer24 und willkommen im Forum!
Nicht zuletzt, da leere Felder (= unmittelbar aufeinander folgendende ";") per Batch etwas unhandlich zu verarbeiten sind, würde ich eher VBS verwenden - etwa:
Nachtrag: Wenn's trotzdem Batch sein soll, relativ ungetestet:
wobei in Zeile 6 nach "
Grüße
bastla
Nicht zuletzt, da leere Felder (= unmittelbar aufeinander folgendende ";") per Batch etwas unhandlich zu verarbeiten sind, würde ich eher VBS verwenden - etwa:
Quelle = "C:\download\products.csv"
Ziel = "C:\import\export.csv"
Spalte = 21
Delim = ";"
Set fso = CreateObject("Scripting.FileSystemObject")
T = Split(fso.OpenTextFile(Quelle).ReadAll, vbNewline)
For i = 0 To UBound(T)
If Trim(T(i)) <> "" Then
Z = Split(T(i), Delim)
Wert = Z(Spalte - 1)
Select Case Wert
Case "YES"
Wert = 99
Case "NO"
Wert = 0
Case "LOW"
Wert = 10
End Select
Z(Spalte - 1) = Wert
T(i) = Join(Z, Delim)
End If
Next
fso.CreateTextFile(Ziel).Write Join(T, vbNewline)
@echo off & setlocal enabledelayedexpansion
set "Quelle=C:\download\products.csv"
set "Ziel=C:\import\export.csv"
set /a Spalte=21
>"%Ziel%" (for /f "usebackq eol=° delims=" %%z in ("%Quelle%") do (
set "ZeileEin=%%z"
set "ZeileAus="
set /a Feld=1
for %%a in ("!ZeileEin:;=","!") do (
if !Feld!==%Spalte% (
set "Wert=%%~a"
if "%%~a"=="YES" set "Wert=99"
if "%%~a"=="NO" set "Wert=0"
if "%%~a"=="LOW" set "Wert=10"
set "ZeileAus=!ZeileAus!;!Wert!"
) else (
set "ZeileAus=!ZeileAus!;%%~a"
)
set /a Feld+=1
)
echo(!ZeileAus:~1!
))
eol=
" ein Zeichen folgen muss, das sicher nicht in den Daten vorkommmt ...Grüße
bastla
Hallo eimer24!
Poste doch bitte einmal (unter Verwendung von "Code"-Formatierung) die ersten etwa 10 Zeilen der CSV-Datei ...
BTW: Die Einträge "YES", "NO" und "LOW" sind immer in Großbuchstaben?
Grüße
bastla
Poste doch bitte einmal (unter Verwendung von "Code"-Formatierung) die ersten etwa 10 Zeilen der CSV-Datei ...
BTW: Die Einträge "YES", "NO" und "LOW" sind immer in Großbuchstaben?
Grüße
bastla
Hallo eimer24!
Ich habe mit Deiner Originaldatei (zum Testen suboptimal, da kein "LOW" bzw "NO" vorkommt, daher zusätzlich auch eine angepasste Kopie verwendet) und mit VBS - in dieser Fassung:
- Erfolg gehabt ...
Grüße
bastla
P.S.: Die CMD-Version hatte ich eigentlich ohnehin nur aus sportlichen Gründen hinzugefügt - da auch Anführungszeichen in den Datenfeldern enthalten sind, bleibe ich bei der VBS-Variante ...
Ich habe mit Deiner Originaldatei (zum Testen suboptimal, da kein "LOW" bzw "NO" vorkommt, daher zusätzlich auch eine angepasste Kopie verwendet) und mit VBS - in dieser Fassung:
Quelle = "C:\download\products_v1_0.csv"
Ziel = "C:\import\export.csv"
Spalte = 21
Delim = ";"
Set fso = CreateObject("Scripting.FileSystemObject")
T = Split(fso.OpenTextFile(Quelle).ReadAll, vbNewline)
For i = 0 To UBound(T)
If Trim(T(i)) <> "" Then
Z = Split(T(i), Delim)
Wert = Z(Spalte - 1)
Select Case Wert
Case "YES"
Wert = 99
Case "NO"
Wert = 0
Case "LOW"
Wert = 10
End Select
Z(Spalte - 1) = Wert
T(i) = Join(Z, Delim)
End If
Next
fso.CreateTextFile(Ziel).Write Join(T, vbNewline)
Grüße
bastla
P.S.: Die CMD-Version hatte ich eigentlich ohnehin nur aus sportlichen Gründen hinzugefügt - da auch Anführungszeichen in den Datenfeldern enthalten sind, bleibe ich bei der VBS-Variante ...
Hallo eimer24!
bzw
ändern ...
Grüße
bastla
Woran kann das denn liegen ?
Einzige Idee, die ich noch hätte: Das Format der Ausgangsdatei ist Unicode (war es bei Deiner Beispieldatei allerdings nicht) - dann müsstest Du die Zeilen 7 und 28 aufT = Split(fso.OpenTextFile(Quelle, 1, True, True).ReadAll, vbNewline)
fso.CreateTextFile(Ziel, 2, True, True).Write Join(T, vbNewline)
Grüße
bastla
Hallo bastla,
bis heute genügte es mir immer im administrator-forum mitzulesen -> In diesem Sinne mal ein herzliches HALLO an alle hier!!!
Jetzt stehe ich allerdings etwas auf dem Schlauch.
Mit der vbs habe ich den gleichen Fehler wie Remie und die bat Datei zerhaut mir die csv, weil mein Dateilieferant im Text " Zeichen beutzt und
die batch dann in der neu abgelegten csv die Spalten umsortiert. Alle Versuche, vorher die "-Zeichen in etwas anderes zu ersetzen schlagen leider fehl.
Vielleicht hast du ja einen Tipp, wie ich vorher die "-Zeichen aus dem Text bekomme?
Vielen Dank und VG
marcel
bis heute genügte es mir immer im administrator-forum mitzulesen -> In diesem Sinne mal ein herzliches HALLO an alle hier!!!
Jetzt stehe ich allerdings etwas auf dem Schlauch.
Mit der vbs habe ich den gleichen Fehler wie Remie und die bat Datei zerhaut mir die csv, weil mein Dateilieferant im Text " Zeichen beutzt und
die batch dann in der neu abgelegten csv die Spalten umsortiert. Alle Versuche, vorher die "-Zeichen in etwas anderes zu ersetzen schlagen leider fehl.
Vielleicht hast du ja einen Tipp, wie ich vorher die "-Zeichen aus dem Text bekomme?
Vielen Dank und VG
marcel
Hallo marcel78 und willkommen als Mitglied!
Kannst Du bitte einen Auszug (ggf mit anonymisierten Daten) aus Deiner csv-Datei als "Code" formatiert posten und kurz die gewünschte Verarbeitung erklären - ohne (einigermaßen originale) Daten ist es schwer, zu klären, warum etwas nicht wie gewünscht / erwartet funktioniert ...
Grüße
bastla
Kannst Du bitte einen Auszug (ggf mit anonymisierten Daten) aus Deiner csv-Datei als "Code" formatiert posten und kurz die gewünschte Verarbeitung erklären - ohne (einigermaßen originale) Daten ist es schwer, zu klären, warum etwas nicht wie gewünscht / erwartet funktioniert ...
Grüße
bastla
Hallo marcel78!
Aufgrund der Hinweise per Mail (Änderung soll in Spalte 13 erfolgen, VBS funktioniert bei großer Datei nicht) eine Variante, bei der jeweils nur eine Zeile eingelesen, verarbeitet und gleich wieder in die Zieldatei geschrieben wird:
Grüße
bastla
Aufgrund der Hinweise per Mail (Änderung soll in Spalte 13 erfolgen, VBS funktioniert bei großer Datei nicht) eine Variante, bei der jeweils nur eine Zeile eingelesen, verarbeitet und gleich wieder in die Zieldatei geschrieben wird:
Quelle = "D:\products.csv"
Ziel = "D:\export.csv"
Spalte = 13
Delim = ";"
Set fso = CreateObject("Scripting.FileSystemObject")
Set Ein = fso.OpenTextFile(Quelle)
Set Aus = fso.CreateTextFile(Ziel)
Do Until Ein.AtEndOfStream
Zeile = Ein.ReadLine
If Trim(Zeile) <> "" Then
Z = Split(Zeile, Delim)
Wert = Z(Spalte - 1)
Select Case LCase(Wert)
Case "ja" 'Kleinschreibung verwenden
Wert = 10
Case "nein" 'Kleinschreibung verwenden
Wert = 0
End Select
Z(Spalte - 1) = Wert
Aus.WriteLine Join(Z, Delim)
End If
Loop
bastla