walker950
Goto Top

Powershell Dateiinhalt mit Substring Anfang und Ende ändern und wieder speichern

Guten Tag zusammen,

Ich bin noch Neuling was Powershell angeht. Verusche jedoch mein bestes. Nach Stunden mit googlen und lesen stelle ich meine Frage hier.

Ich habe eine Datei die hat folgenden Inhalt:

03400.600_0011_ HA_Text nun möchte ich erreichen, dass von links her 14 Zeichen stehen bleiben und der Rest abgeschnitten wird.
Das gleiche mit 03400.600_0011_0123_BG_Text mit den 19 Zeichen von links

Das die Datei eingelsen wird habe ich hinbekommen. Was ich nicht verstehe wie ich dazu komme, dass der ganze Datei Inhalt Zeile für Zeile geprüft wird und die Substringfunktion ausgeführt wird.
mir die geänderten Zeilen anzeigt und dan wieder in die Datei schreibt.

$DateiPfad = 'Z:\Dokumente\test.txt'  


# Get-Content liest eine Texdatei Zeile fü Zeile ein
# in der Variablen $Zeilen steht deshalb eine Liste von Zeilen (Array)

$Zeilen =  Get-Content -Path $DateiPfad



# Zeilen Zähler, wird nur gebraucht um die erste Zeile zu erkennen
$ZeilenZähler = 1

# jede Zeile abarbeiten
foreach($Zeile in $Zeilen)
{
    # Hier findet die Veränderung  des Dateiinhalts statt.
    
   $Substring  "1","19"  
    
   }

Würde mich über Unterstützung freuen.

Grüsse
walker950

Content-Key: 550764

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

Ausgedruckt am: 29.03.2024 um 04:03 Uhr

Mitglied: 143127
143127 22.02.2020 aktualisiert um 13:12:43 Uhr
Goto Top
Da gibt's viele mögliche Varianten
$DateiPfad = 'Z:\Dokumente\test.txt'  
(gc $dateipfad) | %{$_[0..18] -join ''} | sc $dateipfad  
oder
$DateiPfad = 'Z:\Dokumente\test.txt'  
(gc $dateipfad) | %{$_ -Replace '^(.{19}).*','$1'} | sc $dateipfad  
oder
$DateiPfad = 'Z:\Dokumente\test.txt'  
[regex]::matches((gc $dateipfad -raw),'(?im)^.{0,19}').Value | sc $dateipfad  
oder
$DateiPfad = 'Z:\Dokumente\test.txt'  
(gc $dateipfad) | %{
    if ($_.Length -ge 19){
        $_.Substring(0,19)
    }else{
        $_
    }
} | sc $dateipfad
usw. macht alles das gleiche, such dir was davon aus was dir am besten passt.
Mitglied: walker950
walker950 23.02.2020 um 07:46:01 Uhr
Goto Top
Guten Morgen vibrations

Danke für deine Hilfe, habe alle mal ausprobiert, konnte mich jedoch noch nicht entscheiden.
Wer hat die Wahl, hat die Qual. face-smile

Da ich verschieden lange Zeichenketten habe, möchte ich wissen wie man das hinbekommt das alles beim ersten ausführen erledigt wird.
Das heisst PS soll prüfen welche längen der Zeichenketten vorhanden sind und dann die richtigen mit den entsprechenden Parametern abschneiden.
Es befinden sich beide Formen in einer Liste. Ein aussortieren und zwei Listen machen ist vermutlich nicht der richtige Weg.

Ausgangslage:
03400.600_0001_hb hier hat es Text. (Vorher) Bis zum Abschneidepunkt sind es 14 Zeichen
03400.600_0001 (Nachher)

03400.600_0002_0011_AH hier hat es Text (Vorher) Bis zum Abschneidepunkt sind es 19 Zeichen
03400.600_0002_0011 (Nachher)

Anzeigen der geänderten Dateiinhalte wäre auch super.

Grüsse
walker950
Mitglied: 143127
143127 23.02.2020 aktualisiert um 08:00:01 Uhr
Goto Top
Was ist denn das Unterscheidungsmerkmal der beiden Formen? Die Länge ist klar aber an welchem eindeutigen Muster lässig sich erkennen was welches Format ist, das geht aus deinen Beispielen leider nicht ganz eindeutig hervor. Sind es z.B. nur Zahlen Unterstriche und Punkte oder kommen dann da auch noch andere Varianten mit Buchstaben oder sonstigen Sonderzeichen?

Mit etwas Regex ist das Unterscheiden dann kein Thema.
Mitglied: 143127
143127 23.02.2020 aktualisiert um 08:11:52 Uhr
Goto Top
Hier ein Beispiel so wie ich interpretiert habe
https://tio.run/##jY9Ni8IwFEX3@RUPKTRBLeloLQpSBRezdDG48SNE@zSFiJK8Yhfz32 ...

# Dateipfad
$DateiPfad = 'z:\Dokumente\test.txt'  
# Teile extrahieren
$result = [regex]::matches((gc $dateipfad -raw),'(?im)^\d+\.\d+_\d+(_\d+)?(?=_)').Value   
# Ausgabe auf die Konsole
$result
# Dateiausgabe
$result | sc $dateipfad
Mitglied: walker950
walker950 23.02.2020 um 08:16:18 Uhr
Goto Top
Eindeutiges Merkmal ist das Fett formatierte

03400.600_0011_0001_Kurzeichen bis 4 Zeichen Variabel_ Ort
03400.600_0011__Kurzeichen bis 4 Zeichen Variabel_ Ort

Grüsse
walker950
Mitglied: walker950
walker950 23.02.2020 um 08:47:17 Uhr
Goto Top
Hallo vibrations

Ja genau so soll es am Enden sein. Im Code sind aktuell 14 und 19 Zeichen von links eingestellt.
Sollte nun aber andere Werte eingegebn werden wie kann ich das im Code File ändern?

Input:
03400.600_0011_0001_HEA Zuerich
03400.600_0012_0002_AZ Bern
03400.600_0013_PIP Lausanne
03400.600_0014_DC Fribourg
03400.600_0015_0124_MUM Zuerich
03400.600_0014_GAR Zuerich

Output:
03400.600_0011_0001
03400.600_0012_0002
03400.600_0013
03400.600_0014
03400.600_0015_0124
03400.600_0014

Danke und Grüsse
walker950
P S hast du mir einen Tipp, wo ich PS erlennen kann?
Mitglied: 143127
Lösung 143127 23.02.2020 aktualisiert um 09:10:01 Uhr
Goto Top
Zitat von @walker950:

Hallo vibrations

Ja genau so soll es am Enden sein.
Im Code sind aktuell 14 und 19 Zeichen von links eingestellt.
Nein ist es nicht, das ist ein Regular Expressions String der deine zwei Muster automatisch anhand des Musters erkennt

Sollte nun aber andere Werte eingegebn werden wie kann ich das im Code File ändern?
Den Regex an deine Gegebenheiten anpassen.
Input:
03400.600_0011_0001_HEA Zuerich
03400.600_0012_0002_AZ Bern
03400.600_0013_PIP Lausanne
03400.600_0014_DC Fribourg
03400.600_0015_0124_MUM Zuerich
03400.600_0014_GAR Zuerich

Output:
03400.600_0011_0001
03400.600_0012_0002
03400.600_0013
03400.600_0014
03400.600_0015_0124
03400.600_0014
Genau das macht der Code oben schon. Guckst du
https://tio.run/##bY9La4NAFIX3/opLEBxJI2NiuwgEY5u@IAEptIs07TDVGx2YaJgHyS ...

Danke und Grüsse
walker950
P S hast du mir einen Tipp, wo ich PS erlennen kann?
RTFM ist weiterhin die nachhaltigste Methode dann lernst du es von Grund auf und verpasst auch nichts wichtiges.

Viel Erfolg.

Ciao und Helau.
Mitglied: walker950
walker950 23.02.2020 um 09:18:10 Uhr
Goto Top
Wünsche Dir einen schönen Sonntag
und nochmals vielen Dank für deine
super Hilfe.
Grüssse
walker950