jocheng
Goto Top

Feld in Datum formatieren - bat

Hallo Leute ich bin neu hier und auf der Suche nach Hilfe.

Ich habe folgendes Problem mit einer CSV Datei
1;201520;30579;0001;XS;4053986214967;in_stock;;0
1;201520;30579;0003;L;4055262365981;in_stock;;137 
1;201520;30579;0003;M;4055262365974;in_stock;;43 
1;201520;30579;0003;S;4055262365967;in_stock;;74
1;201520;30579;0003;XL;4055262365998;in_stock;;17
1;201520;30579;0003;XS;4055262365950;in_stock;;5
1;201520;30581;0001;L;4053986217043;in_stock;;0
1;201520;30581;0001;L;4053986217043;incoming;20151214;91
1;201520;30581;0001;L;4053986217043;incoming;20160213;128
1;201520;30581;0001;M;4053986217036;in_stock;;0
1;201520;30581;0001;M;4053986217036;incoming;20151214;89
1;201520;30581;0001;M;4053986217036;incoming;20160213;131
Die Werte 20151214 und 20160213 in den letzten beiden Zeilen stehen dabei als Beispiel für Datumsangaben. Diese brauche ich mittels einer .bat Datei in das Richtig Datum formatiert.

Punkt 1 - Aus 20151214 soll also 14.12.2015 werden.
Punkt 2 - Zudem soll die immer wenn 2x incoming mit der gleichen Nummer (Beispiel: 4053986217036) auftaucht die untere Zeile gelöscht werden.

Kann mir jemand helfen??? Wäre auch bereit dafür etwas zu bezahlen face-smile (dann bitte per PM melden)

Content-ID: 286556

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

Ausgedruckt am: 26.11.2024 um 12:11 Uhr

114757
114757 24.10.2015 um 14:21:15 Uhr
Goto Top
Moin,
mit Powershell z.B. so
# Path to csv
$path = 'C:\temp\daten.csv'  
# import csv as object
$csv = Import-CSV $path -Delimiter ";" -Header 1,2,3,4,5,6,7,8,9  
$doubles = @()
# replace dates
$csv | ?{$_.8 -ne ""} | %{$_.8 = $_.8 -replace '(\d{4})(\d{2})(\d{2})','$3.$2.$1'}  
# remove duplicates an export
($csv | %{if ($_.7 -eq 'incoming'){if($_.6 -notin $doubles){$doubles +=$_.6;$_}}else{$_}} | convertto-csv -Delimiter ";" -NoTypeInformation | select -skip 1) -replace '"','' | set-content $path -Encoding UTF8  
Gruß jodel32
Pjordorf
Pjordorf 24.10.2015 um 15:20:48 Uhr
Goto Top
Hallo,

Zitat von @jocheng:
in das Richtig Datum formatiert.
Nun, das Datum dort ist nicht falsch. Abhängig von Länder und Regionen, Datums und Zeit Einstellungen usw. ist die Schreibweise durchaus als richtig anzusehen, nur nicht in dein gewünschtes Aussehen (Format) face-smile

Gruß,
Peter
jocheng
jocheng 27.10.2015 um 23:21:52 Uhr
Goto Top
Ich bekomme da die Fehlermeldung "Die Bennenung "-" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt, Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist.....

Bei Zeile :1 Zeichen:2 + - <<<<
jocheng
jocheng 27.10.2015 um 23:22:20 Uhr
Goto Top
Ich bekomme da die Fehlermeldung "Die Bennenung "-" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt, Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist.....

Bei Zeile :1 Zeichen:2 + - <<<<
114757
114757 28.10.2015 um 08:30:06 Uhr
Goto Top
mind. PS 3.0 nutzen !
jocheng
jocheng 29.10.2015 um 15:23:27 Uhr
Goto Top
So bisher habe ich

@echo off
cd C:\start\
Setlocal
for /f "tokens=1-13 delims=;" %%A IN ('findstr "incoming" "start.csv"') DO (  
  Setlocal EnableDelayedExpansion	
  set Datum=%%H
  set Datum=!Datum:~6,2!.!Datum:~4,2!.!Datum:~0,4!
  echo=%%A;%%B;%%C;%%D;%%E;%%F;%%G;!Datum!;%%I;%%J;%%K;%%L;%%M >>"C:\start\test\test.csv"  
)


geschrieben. Das Problem was ich dabei aber noch habe ist das "incoming" mit der gleichen Nummer (Beispiel 4053986217043) 2mal (in der kompletten Datei auch mehrmals) dabei ist. Ich brauche aber nur die oberste Zeile.

Ich brauch also etwas um Zeilen zu vergleichen. Kann mir hier jemand weiterhelfen???
rubberman
rubberman 29.10.2015 um 18:13:44 Uhr
Goto Top
Hallo jocheng.

Batch ist für dein Vorhaben suboptimal und fehlerbehaftet (darum habe ich mich auch zurückgehalten). Wenn es unbedingt Batch sein muss, von mir aus ...
@echo off &setlocal DisableDelayedExpansion
set "csv_in=test.csv"  
set "csv_out=test2.csv"  

setlocal EnableDelayedExpansion
for /f "tokens=1* delims=:" %%i in ('type "!csv_in!"^|findstr /nrc:"..*;incoming;20[0-9][0-9][01][0-9][0-3][0-9];..*"') do (  
  for /f "tokens=6,8 delims=;" %%k in ("%%j") do (  
    set "num[%%i]=%%k"  
    set "d=%%l"  
    set "date[%%i]=!d:~-2!.!d:~4,2!.!d:~,4!"  
  )
)

<"!csv_in!" >"!csv_out!" (  
  for /f %%i in ('type "!csv_in!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (  
    set "ln=" & set /p "ln="  
    if "!num[%%j]!"=="" (  
      echo(!ln!
    ) else (
      if "!numbefore!" neq "!num[%%j]!" (  
        for /f "tokens=1-8* delims=;" %%k in ("!ln!") do (  
          echo(%%k;%%l;%%m;%%n;%%o;%%p;%%q;!date[%%j]!;%%s
        )
      )
      set "numbefore=!num[%%j]!"  
    )
  )
)

Laufzeiten jenseits von gut und böse hast du inklusive ...

Grüße
rubberman
jocheng
jocheng 03.11.2015 um 13:23:07 Uhr
Goto Top
klappt super und macht genau das was es soll danke. Die etwas längere Ladezeit nehme ich kauf dafür das ich alle in einer batch habe. ;)