eimer24
Goto Top

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:

@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

Content-Key: 197091

Url: https://administrator.de/contentid/197091

Printed on: April 18, 2024 at 00:04 o'clock

Member: bastla
bastla Jan 16, 2013 updated at 16:57:42 (UTC)
Goto Top
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:
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)
Nachtrag: Wenn's trotzdem Batch sein soll, relativ ungetestet:
@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!
))
wobei in Zeile 6 nach "eol=" ein Zeichen folgen muss, das sicher nicht in den Daten vorkommmt ...

Grüße
bastla
Member: eimer24
eimer24 Jan 17, 2013 updated at 09:58:27 (UTC)
Goto Top
Hallo,

ich danke dir !!

Also die VBS erstellt mir zwar die Ausgangs Datei, jedoch ist in Spalte 21 nichts Verändert.
Die Batch funktioniert da jedoch hervorragend.
Eine Zeile schmeißt Sie mir leider übern haufen aber ansonsten funktionierts.

Hast du eine schnelle Ahnung wieso die VBS nicht funktioniert ?

Ach und noch eine Frage =)
Kann man noch einstellen das er die Ausgangsdatei nach der Bearbeitung löscht ?

[Edit}
Ahh merke gerade, die Batch zerstört mir die Spaltenaufteilung, so kann sie nicht Importiert werden. =(

Mit freundlichen Grüßen

Remie
Member: pieh-ejdsch
pieh-ejdsch Jan 17, 2013 at 10:42:34 (UTC)
Goto Top
moin Remie,

Kommt denn "YES"; "NO" und "LOW" auch in anderen Spalten vor?

Gruß Phil
Member: eimer24
eimer24 Jan 17, 2013 at 10:56:58 (UTC)
Goto Top
Grüße,

jap, Spalte 21 sind die Lagerbestände und die bestehen nur aus diesen 3 Wörtern.

M.f.G.
Member: bastla
bastla Jan 17, 2013 updated at 11:23:05 (UTC)
Goto Top
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
Member: eimer24
eimer24 Jan 17, 2013 at 13:56:32 (UTC)
Goto Top
immer in Großbuchstaben ja

Kann ich dir die per PN senden ?

Mit freundlichen Grüßen
Member: bastla
bastla Jan 17, 2013 updated at 16:20:16 (UTC)
Goto Top
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:
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)
- Erfolg gehabt ...

Grüße
bastla

P.S.: Die CMD-Version hatte ich eigentlich ohnehin nur aus sportlichen Gründen face-wink hinzugefügt - da auch Anführungszeichen in den Datenfeldern enthalten sind, bleibe ich bei der VBS-Variante ...
Member: eimer24
eimer24 Jan 22, 2013 at 17:08:15 (UTC)
Goto Top
Grüße dich,

danke erstmal.

Jetz verrat mir mal wieso das bei dir funktioniert und bei mir nicht.
Genau das gleiche wie das erste mal, export Datei wird erstellt aber nichts geändert.

Woran kann das denn liegen ?

Hoffe kannst mir helfen.

Mit freundlichen Grüßen

Remie
Member: bastla
bastla Jan 22, 2013 at 17:21:34 (UTC)
Goto Top
Hallo eimer24!
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 auf
T = Split(fso.OpenTextFile(Quelle, 1, True, True).ReadAll, vbNewline)
bzw
fso.CreateTextFile(Ziel, 2, True, True).Write Join(T, vbNewline)
ändern ...

Grüße
bastla
Member: eimer24
eimer24 Jan 23, 2013 at 08:22:33 (UTC)
Goto Top
Hallo,

also wenn ich die Zeilen so ändere dann startet das Script garnicht und sagt mir "Laufzeitfehler in Microsoft VBScript".

Das kann doch nicht sein das es bei dir funktioniert und bei mir nicht, habs jetzt auch nochmal auf einen anderen Rechner mit XP ausprobiert, funktioniert auch nicht.

Danke dir schonmal!

M.f.G.
Remie
Member: eimer24
eimer24 Jan 24, 2013 at 08:52:59 (UTC)
Goto Top
Hallo,

ich habs jetzt nochmal mit der CSV probiert die ich dir geschickt habe, mit der funktioniert es komischer weise.
Wenn ich meine komplette, aus 5103 Zeilen bestehende, benutze ändert sich garnichts.

Mit freundlichen Grüßen
Remie
Member: bastla
bastla Jan 24, 2013 at 11:43:18 (UTC)
Goto Top
Hallo eimer24!

Da ich zum Testen ja nur die "funktionierende" Datei hatte, kann ich leider noch nicht einmal mehr raten, woran es beim "Original" liegt ... face-sad

Grüße
bastla
Member: marcel78
marcel78 Aug 01, 2013 at 09:18:11 (UTC)
Goto Top
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
Member: bastla
bastla Aug 01, 2013 at 09:48:12 (UTC)
Goto Top
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
Member: marcel78
marcel78 Aug 01, 2013 at 10:03:29 (UTC)
Goto Top
Moin und danke für die schnelle Antwort!

Kann ich die die per pn schicken? Ich stehe mit der Formatierung auf dem Schlauch. oder gibts da einen copy paste Trick?

VG
Member: bastla
bastla Aug 01, 2013 at 10:21:04 (UTC)
Goto Top
Hallo marcel78!.

Formatierung: Einfach Deine kopierten Daten zwischen "<code>"- und "</code>"-Tags setzen.

Ansonsten kannst du mir natürlich auch eine PN schicken ...

Grüße
bastla
Member: bastla
bastla Aug 01, 2013 at 13:58:38 (UTC)
Goto Top
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:
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
Grüße
bastla
Member: marcel78
marcel78 Aug 01, 2013 at 14:06:30 (UTC)
Goto Top
Hallo bastla!

Vielen Dank für die Unterstützung, daran hat es gelegen. Da muss ich wohl mal etwas am RAM basteln face-wink

Gelöst


Beste Grüße
marcel