bicheck
Goto Top

CMD - Spalte in CSV Datei hinzufügen mit Datei-Erstelldatum

Hallo Gemeinde,

ich stehe aufm Schlauch und benötige eure Hilfe.

Hintergrund:
Ich erhalte stündlich einen Report per csv, dieser hat immer den gleichen Namen z.B. datei.csv. Diese Datei lade ich nach Erhalt sofort in eine MySQL Datenbank für weitere Verarbeitung.

Mein Problem:
Die datei.csv hat folgenden Inhalt:
pg;mat;price
1;mat1;25
2;mat34;26
usw

Anforderung:
ich würde gern per cmd/bat File dieser csv einen "Timestamp" = Datei-Erstelldatum hinzufügen z.B. 2023-05-12 10:00.
pg;mat;price;stamp
1;mat1;25;2023-05-12 10:00
2;mat34;26;2023-05-12 10:00

Zum Verständnis: Timestamp ist für mich später ganz wichtig, da ich die Preisentwicklungen einsehen/dem Datum zuordnen möchte.

Variante A: ich bekomme das mit einer CMD hin + anschließend die Datei in die MySql laden
Variante B: kann das die MySql auch? (beim Import der Datei deren Erstelldatum auslesen)
Variante C: alternativ Vorschläge?

Content-Key: 7123857109

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

Printed on: April 29, 2024 at 16:04 o'clock

Member: Kraemer
Kraemer May 12, 2023 updated at 09:24:09 (UTC)
Goto Top
Powershell

$Datei="C:\temp\datei.csv"  
import-csv -Path $Datei -Delimiter ";" -Encoding UTF8 | Add-Member -MemberType NoteProperty -Name "stamp" -Value (get-date ((Get-ChildItem $Datei).CreationTime)) -Format "yyyy-MM-dd mm:ss") | Export-Csv -Path  $Datei -Delimiter -Encoding UTF8 -NoTypeInformation  

Aus dem Kopf geschrieben also bitte mit Testdatei prüfen
Member: bicheck
bicheck May 12, 2023 at 09:31:06 (UTC)
Goto Top
wau, so schnell face-smile

Ich bekomme diesen Fehler hier:

In Zeile:2 Zeichen:189
+ ... -ChildItem $Datei).CreationTime)) -Format "yyyy-MM-dd mm:ss") | Expor ...  
+                                                                 ~
Unerwartetes Token ")" in Ausdruck oder Anweisung.  
In Zeile:2 Zeichen:191
+ ... hildItem $Datei).CreationTime)) -Format "yyyy-MM-dd mm:ss") | Export- ...  
+                                                                 ~
Ein leeres Pipeelement ist nicht zulässig.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken
Mitglied: 3063370895
3063370895 May 12, 2023 updated at 09:38:06 (UTC)
Goto Top
Hi,

Da waren die Klammern falsch, sollte wohl so aussehen:
$Datei="C:\temp\datei.csv"  
import-csv -Path $Datei -Delimiter ";" -Encoding UTF8 |  
Add-Member -MemberType NoteProperty -Name "stamp" -Value (get-date ((Get-ChildItem $Datei).CreationTime) -Format "yyyy-MM-dd mm:ss") |  
Export-Csv -Path  $Datei -Delimiter -Encoding UTF8 -NoTypeInformation
Hinweis: nach jedem Pipeline-Operator "|" darf man ein newline setzen, das erhöht etwas die Übersichtlichkeit

-Thomas
Member: bicheck
bicheck May 12, 2023 at 09:47:10 (UTC)
Goto Top
$Datei="C:\temp\datei.csv"  
import-csv -Path $Datei -Delimiter ";" -Encoding UTF8 |  
Add-Member -MemberType NoteProperty -Name "stamp" -Value (get-date ((Get-ChildItem $Datei).CreationTime) -Format "yyyy-MM-dd mm:ss") |  
Export-Csv -Path  $Datei -Delimiter -Encoding UTF8 -NoTypeInformation

gestestet - es gab einen Fehler beim Export - "Export-Csv : Fehlendes Argument für den Parameter "Delimiter". Geben Sie einen Parameter vom Typ "System.Char" an, und versuchen Sie es erneut."

Draufhin habe ich im Export-Csv Bereich den Delimiter als ";" gesetzt, lief ohne Fehler. Allerdings wurde die Datei geleert. face-smile

Import-csv -Path $Datei -Delimiter ";" -Encoding UTF8 |  
Add-Member -MemberType NoteProperty -Name 'stamp' -Value (get-date ((Get-ChildItem $Datei).CreationTime) -Format "yyyy-MM-dd mm:ss") |  
Export-Csv -Path  $Datei -Delimiter ";" -Encoding UTF8 -NoTypeInformation  
Mitglied: 3063370895
Solution 3063370895 May 12, 2023 updated at 09:57:21 (UTC)
Goto Top
So funktionierts:
$datei = "C:\tmp\1.csv"  
$csv = Import-csv -Path $Datei -Delimiter ";" -Encoding UTF8   
$csv | Add-Member -MemberType NoteProperty -Name 'stamp' -Value (get-date ((Get-ChildItem $Datei).CreationTime) -Format "yyyy-MM-dd HH:mm")   
$csv | Export-Csv -Path  $Datei -Delimiter ";" -Encoding UTF8 -NoTypeInformation  
Der Fehler war, dass angenommen wurde, dass Add-Member das bearbeitete Objekt in die Pipeline weitergibt, was es leider nicht tut.

EDIT: im Zeitformat war noch ein Fehler, eben gefixt.
-Thomas
Member: Kraemer
Kraemer May 12, 2023 at 09:56:39 (UTC)
Goto Top
Zitat von @3063370895:

Der Fehler war, dass angenommen wurde, dass Add-Member das bearbeitete Objekt in die Pipeline weitergibt, was es leider nicht tut.

f... - den Fehler mache ich immer wieder... face-wink
Member: bicheck
bicheck May 12, 2023 at 10:05:27 (UTC)
Goto Top
tatsächlich :D es geht. Vielen lieben Dank
Mitglied: 3063370895
3063370895 May 12, 2023 at 10:08:48 (UTC)
Goto Top
Zitat von @bicheck:

tatsächlich :D es geht. Vielen lieben Dank
Bitte noch die Lösung markieren face-smile

-Thomas
Mitglied: 7010350221
7010350221 May 12, 2023 updated at 10:36:45 (UTC)
Goto Top
Der Fehler war, dass angenommen wurde, dass Add-Member das bearbeitete Objekt in die Pipeline weitergibt, was es leider nicht tut.
Nur als Ergänzung: Mit dem-Passthru-Parameter würde es das auch tun.
Mitglied: 3063370895
3063370895 May 12, 2023 updated at 10:53:48 (UTC)
Goto Top
Zitat von @7010350221:

Der Fehler war, dass angenommen wurde, dass Add-Member das bearbeitete Objekt in die Pipeline weitergibt, was es leider nicht tut.
Nur als Ergänzung: Mit dem-Passthru-Parameter würde es das auch tun.

Möchte man meinen, tuts aber nicht (war auch mein erster Versuch)
$datei = "C:\tmp\a.csv"  
Import-csv -Path $Datei -Delimiter ";" -Encoding UTF8 |  
Add-Member -MemberType NoteProperty -Name 'stamp' -Value (get-date ((Get-ChildItem $Datei).CreationTime) -Format "yyyy-MM-dd HH:mm") -PassThru |  
Export-Csv -Path  $Datei -Delimiter ";" -Encoding UTF8 -NoTypeInformation  
leert die CSV

-Thomas
Mitglied: 7010350221
7010350221 May 12, 2023 updated at 11:18:25 (UTC)
Goto Top
Zitat von @3063370895:

Zitat von @7010350221:

Der Fehler war, dass angenommen wurde, dass Add-Member das bearbeitete Objekt in die Pipeline weitergibt, was es leider nicht tut.
Nur als Ergänzung: Mit dem-Passthru-Parameter würde es das auch tun.

Möchte man meinen, tuts aber nicht (war auch mein erster Versuch)
$datei = "C:\tmp\a.csv"  
Import-csv -Path $Datei -Delimiter ";" -Encoding UTF8 |  
Add-Member -MemberType NoteProperty -Name 'stamp' -Value (get-date ((Get-ChildItem $Datei).CreationTime) -Format "yyyy-MM-dd HH:mm") -PassThru |  
Export-Csv -Path  $Datei -Delimiter ";" -Encoding UTF8 -NoTypeInformation  
leert die CSV

-Thomas

Ist ja kein Wunder wenn du in der Pipe gleichzeitig die Datei lesen und in die selbe Datei zurückschreiben willst face-wink. In dem Fall musst du das Import-CSV klammern damit die Datei nach dem Einlesen wieder geschlossen wird, oder in eine andere Datei zurückschreiben.
$datei = "C:\tmp\a.csv"  
(Import-csv -Path $Datei -Delimiter ";" -Encoding UTF8) | Add-Member -MemberType NoteProperty -Name 'stamp' -Value (get-date ((Get-ChildItem $Datei).CreationTime) -Format "yyyy-MM-dd HH:mm") -PassThru | Export-Csv -Path  $Datei -Delimiter ";" -Encoding UTF8 -NoTypeInformation  
Mitglied: 3063370895
3063370895 May 12, 2023 at 11:24:22 (UTC)
Goto Top
Merkwürdig, dass dann keine Fehlermeldung kommt und die Datei geleert wird.

bei get-content | setcontent kommt die entsprechende Meldung

Set-Content : Der Prozess kann nicht auf die Datei "C:\tmp\a.txt" zugreifen, da sie von einem anderen Prozess verwendet wird.  

-Thomas
Member: bicheck
Solution bicheck May 12, 2023 at 11:45:53 (UTC)
Goto Top
das funktioniert, vielen Dank!

$Datei="C:\temp\datei.csv"  
$csv = Import-csv -Path $Datei -Delimiter ";" -Encoding UTF8   
$csv | Add-Member -MemberType NoteProperty -Name 'stamp' -Value (get-date ((Get-ChildItem $Datei).CreationTime) -Format "yyyy-MM-dd mm:ss")   
$csv | Export-Csv -Path  $Datei -Delimiter ";" -Encoding UTF8 -NoTypeInformation  
Member: bicheck
bicheck May 12, 2023 at 11:49:17 (UTC)
Goto Top
freche Frage :D: kann man mit dem Script auch ein kompletten Ordner mit hunderten csv`s abarbeiten?

Prozessbeispiel:
1 suche eine beliebige csv aus Ordner A
2 führe den Script aus
3 lege die Datei in Ordner B ab
4 lösche die Datei aus Ordner A
5 schritt 1
Mitglied: 7010350221
Solution 7010350221 May 12, 2023 updated at 12:00:12 (UTC)
Goto Top
$quelle = 'D:\quelle'  
$ziel = 'D:\ziel'  
foreach($file in Get-ChildItem $quelle -File -Filter *.csv){
    Import-csv -Path $file.Fullname -Delimiter ';' -Encoding UTF8 | Add-Member -MemberType NoteProperty -Name 'stamp' -Value $file.CreationTime.toString('yyyy-MM-dd HH:mm') -PassThru | Export-Csv -Path  "$ziel\$($file.Name)" -Delimiter ';' -Encoding UTF8 -NoTypeInformation -Force  
    remove-item $file.Fullname
}
-edit- Typo korrigiert.
Member: bicheck
bicheck May 12, 2023 at 12:57:05 (UTC)
Goto Top
Es ist perfekt! 1000x Danke face-smile