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-Key: 286556

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

Printed on: April 19, 2024 at 19:04 o'clock

Mitglied: 114757
114757 Oct 24, 2015 at 12:21:15 (UTC)
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
Member: Pjordorf
Pjordorf Oct 24, 2015 at 13:20:48 (UTC)
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
Member: jocheng
jocheng Oct 27, 2015 at 22:21:52 (UTC)
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 + - <<<<
Member: jocheng
jocheng Oct 27, 2015 at 22:22:20 (UTC)
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 + - <<<<
Mitglied: 114757
114757 Oct 28, 2015 at 07:30:06 (UTC)
Goto Top
mind. PS 3.0 nutzen !
Member: jocheng
jocheng Oct 29, 2015 at 14:23:27 (UTC)
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???
Member: rubberman
rubberman Oct 29, 2015 at 17:13:44 (UTC)
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
Member: jocheng
jocheng Nov 03, 2015 at 12:23:07 (UTC)
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. ;)