none
PowerShell TXT / CSV Spalten entfernen RRS feed

  • Frage

  • Hallo Zusammen

    Ich bin neu in PowerShell unterwegs und möchte zum beginn eine kleine Automatisierungsaufgabe lösen.

    Für Unseren Webshop erhalten wir von den Lieferanten TXT / CSV Files. Diese sind natürlich von jedem Lieferanten Unterschiedlich.

    Bislang mussten wir die TXT / CSV immer Manuel herunterladen, von Hand bearbeiten und über die Warenwirtschaft importieren.

    Für den Download und Import gibt es bereits Batches welche so auch weiterhin laufen sollen.

    Jetzt geht es jedoch darum die TXT / CSV auch automatisch zu bearbeiten.

    Hierbei benötige ich eure Hilfe:

    Die TXT / CSV Daten sind immer entweder mit ";", "," oder "TAPSTOP" getrennt.

    Die Lieferanten schicken jeweils jeder immer im selben eigenen Format. Sprich Spalte A ist immer Spalte A usw. Jedoch muss das Skript für jeden Lieferanten angepasst werden.

    Beispiel:

    Eine TXT ist so aufgebaut:

    Artikelnummer 2;Artikelnummer;Bezeichnung;Bezeichnung 2;Lagerbestand;Gewicht

    Jetzt müsste mir das Skript z.B. nur Artikelnummer 2, Bezeichnung und Lagerbestand ausgeben.

    Aber wie gehe ich hierfür am besten vor?

    Ich habe es über diverse Batch Files versucht jedoch jeweils ohne richtigen erfolg.

    Ich wäre sehr Dankbar über Hilfe.

    Liebe Grüsse

    Montag, 15. April 2019 13:05

Antworten

  • Da Du keine Spaltenüberschrift hast, die wirklich "Column2" heißt, kann das nciht funktionieren. Besser wäre es vermutlich sowieso eher mit "Include-Listen" zu arbeiten, statt mit Ausschlüssen.

    So hier also ungefähr:

    Import-Csv -Path Temp.txt -Delimiter ";" | 
        Select-Object -Property "Artikelnummer 2", Bezeichnung, Lagerbestand | 
            Export-Csv -Path  tempynew.csv -Delimiter ";" -Encoding UTF8 -NoTypeInformation


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Montag, 15. April 2019 14:02
  • Hallo,

    das hast du nicht so ganz verstanden.

    Schau dir mal die Hilfe der CMDLets die Olaf genannt hat an, oder lies dir mal das hier durch:

    Click

    Beste Gruesse
    brima


    Montag, 15. April 2019 14:03

Alle Antworten

  • Hallo GCCM und willkommen im deutschen Powershell Forum.

    CSV-Dateien einlesen kannst Du ganz einfach mit Import-CSV. Wenn Du nur einen Teil der enthaltenen "Properties" weiterbenutzen möchtest, kannst Du mit einem Select-Object die Ausgabe einschränken.

    Davon unabhängig wäre es natürlcih hilfreich, wenn ihr eue Zulieferer dazu bringen könntet, die Daten in einem standardiesierten Format anzuliefern.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Montag, 15. April 2019 13:26
  • Hi

    Ich bin jetzt einmal soweit gekommen:

    Import-Csv Temp.txt -Delimiter ";" | Select * -ExcludeProperty Column2 | Export-Csv tempynew.csv -Delimiter ";" -Encoding UTF8 -notypeinfo 

    Soweit ich dies Verstanden habe, müsste er ja jetzt die Temp.txt importieren (macht er) und die 2 Spalte (also Spalte B) nicht mehr in die neue CSV Exportieren (was er jedoch ignoriert).

    Oder habe ich hierbei etwas falsch verstanden?

    Leider können die Lieferanten (ohne extrem teure "Abos") die Daten nicht anpassen, da dies für diese selbst ein Mehraufwand sei. Diese seien nach Ihren Warenwirtschaftssystemen Standartisiert.. Immerhin sieht ja jedes CSV / TXT vom selben Lieferanten gleich aus :)

    Gruss

    Montag, 15. April 2019 13:43
  • Da Du keine Spaltenüberschrift hast, die wirklich "Column2" heißt, kann das nciht funktionieren. Besser wäre es vermutlich sowieso eher mit "Include-Listen" zu arbeiten, statt mit Ausschlüssen.

    So hier also ungefähr:

    Import-Csv -Path Temp.txt -Delimiter ";" | 
        Select-Object -Property "Artikelnummer 2", Bezeichnung, Lagerbestand | 
            Export-Csv -Path  tempynew.csv -Delimiter ";" -Encoding UTF8 -NoTypeInformation


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Montag, 15. April 2019 14:02
  • Hallo,

    das hast du nicht so ganz verstanden.

    Schau dir mal die Hilfe der CMDLets die Olaf genannt hat an, oder lies dir mal das hier durch:

    Click

    Beste Gruesse
    brima


    Montag, 15. April 2019 14:03
  • Super :) Langsam blick ich durch!

    Sieht schon viel besser aus :)

    Artikelnummer 2 und Lagerbestand funktionieren, jedoch ist Bezeichnung leer :( Aber ich Probiere weiter

    EDIT:

    So hat geklappt, hab ein Schreibfehler gefunden.

    Jetzt muss ich nur noch den richtigen Code für Latin 1 finden, UTF8 ist nicht korrekt und gibt ? aus :(

    • Bearbeitet GCCM Montag, 15. April 2019 14:29
    Montag, 15. April 2019 14:20
  • Versuche mal "ISO-8859-1".
    Dienstag, 16. April 2019 13:47
  • Jetzt muss ich nur noch den richtigen Code für Latin 1 finden, UTF8 ist nicht korrekt und gibt ? aus :(
    Wow ... wir haben 2019 ... wird's nicht langsam Zeit für Unicode-Unterstützung?  ;-)  :D

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH-666 Dienstag, 16. April 2019 18:45
    Dienstag, 16. April 2019 18:45
  • DAS hängt immer vom Ziel ab. Es gibt sie halt noch, die "Alter Hut"-Systeme, die noch keine Unicodeunterstützung haben. Und UTF ist ja nicht Unicode sondern ein "UCS Transformation Format" während UCS (Universal Character Set) in der Form UCS2 (16-Bit) und UCS4 (32 Bit) vorkommt. Wobei sich die Microsoftunterstützung zur Zeit auf UCS2 beschränkt (String, BSTR, WCHAR, ...). Da es zur Zeit bereits ca. 80 Tausend Schriftzeichen alleine auf dieser Erde gibt, wird es auch bei Microsoft so langsam eng.

    Mal sehen, wann Microsoft deshalb dann klammheimlich UCS4 einführt sowie damals bei Windows 98 eben UCS2.

    Mittwoch, 17. April 2019 08:51
  •  

    Die ganzen Text-Cmdlets unterstützen kein "ISO-8859-1" als Parameter.
    Aber: 

     -Encoding String
     
    geht.


    Grüße, Denniver


    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 17. April 2019 10:20
    Moderator
  • Ja, das ist dann schon etwas eingeschränkter:
    https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/export-csv?view=powershell-6

    -Encoding

    Specifies the encoding for the exported CSV file. The default value is UTF8NoBOM.

    The acceptable values for this parameter are as follows:

    • ASCII: Uses the encoding for the ASCII (7-bit) character set.
    • BigEndianUnicode: Encodes in UTF-16 format using the big-endian byte order.
    • Byte: Encodes a set of characters into a sequence of bytes.
    • Default: Encodes using the default value: ASCII.
    • OEM: Uses the default encoding for MS-DOS and console programs.
    • String: Uses the encoding type for a string.
    • Unicode: Encodes in UTF-16 format using the little-endian byte order.
    • UTF7: Encodes in UTF-7 format.
    • UTF8: Encodes in UTF-8 format.
    • UTF8BOM: Encodes in UTF-8 format with Byte Order Mark (BOM)
    • UTF8NoBOM: Encodes in UTF-8 format without Byte Order Mark (BOM)
    • UTF32: Encodes in UTF-32 format.
    • Unknown: The encoding type is unknown or invalid; the data can be treated as binary.

    Wobei dann String eher das aktuelle Sprachencoding der Umgebung ist, also bei westeuropäisch eben 1252, bei osteuropäisch 1251, usw. usf.

    Wer es denn dann doch genauer benötigt, muss sich wieder mehr mit der .Net-Komponente beschäftigen:
    https://docs.microsoft.com/de-de/dotnet/api/system.text.encoding?view=netframework-4.7.2

    Da kann man dann noch die Codepage genau angeben.

    Mittwoch, 17. April 2019 10:31