Aus Substring subtrahieren - Powerschell

ManHunter4500

Lt. Junior Grade
Registriert
März 2013
Beiträge
282
Hallo liebes Forum,

ich habe folgendes Problem bei meinem kleinem PS "script":

Ich möchte aus einem Substring von jeder Zahl 100 abziehen.

Z.B statt 1308 sollte stehen 1208
1310 1210
1324 1234

nun habe ich folgenden quellcode um den Substring auszulesen:

$datei = Get-content d:\testordner\test.txt

($datei).Substring(12,4)


doch ich weiß nicht wie ich von diesem Substring -100 Subtrahieren kann, die normale subtraktion (also einfach ein minus funktioniert nicht.)

Vielen dank schonmal im vorraus falls jemand helfen kann :)
 
Klar, funktioniert die Subtraktion nicht. Das ist ja auch ein String. (Beispiel: Was ergibt "AbcDEF" - 100?)

Es gibt mit Sicherheit die Funktion einen String zu einem Integer zu "casten". Such mal danach.
 
Das Minus funktioniert dann einwandfrei, wenn deine Variable nur einen Wert gespeichert hat. Wenn in der Textdatei also nur 1308 steht und du $datei - 100 eingibst, funktioniert das. Wenn du aber mehrere Zahlen in der Textdatei hast, dann hast du ein Array und da kann man nicht etwas abziehen, das geht nicht.

Da musst du das Array in einer Foreach Schleife behandeln und dort jedes einzelne Element .

NewArr = @()
foreach ($SingleValue in $Datei){
$NewArr += $SingleValue - 100
}

In der ForEach schleife bekommt $SingleValue bei jedem Durchlauf immer nur jeweils einen Wert. Mit diesem kannst du dann rechnen. Das funktioniert aber nur solange, wie du pro Zeile in der Textdatei einen Wert stehen hast. Wenn die nochmal aufgebröselt sind mit einem Komma z.B. musst du die Werte einzeln in ein Arr speichern.
 
kannst du ein beispiel für den inhalt der test.txt posten?
und soll der geänderte wert dann wieder in eine neue oder die selbe datei zurück geschrieben werden?
 
Danke für die schnellen Antworten!

Die .txt Datei besteht nur aus einem Datum und einer Uhrzeit, Format: 15.09.2017 1324.

Das mit dem casten hat leider nicht so ganz geklappt, aber guter tipp mit der foreach Schleife:)

Und die Datei soll nicht verändert werden, sondern der geänderte Wert soll in eine neue .txt Datei geschrieben werden.

achja und das Datumsformat steht untereinander, hat im ersten Post nicht so gut geklappt das darzustellen :D

EDIT:

also der Quellcode sieht inzwischen wie folgt aus:

$datei = Get-content d:\testordner\test.txt

($datei).Substring(12,2)

$empty=@()
foreach ($SingleValue in $datei) {
$empty += $SingleValue -1
}


leider wirft die shell mir den Fehler aus: "Die Eingabenzeichenfolge hat das falsche Format."

theoretisch müsste es gehen, oder habe ich irgendwas vergessen?

Inzwischen möchte ich nurnoch -1 abziehen da ich den substring nur auf Stunden gekürzt habe.

Beispiel der Ausgabe:
11
13
16

Soll sein:
10
12
15
 
Zuletzt bearbeitet:
Wir sind die Datensätze denn getrennt?

Nur zeilenweise oder nur auch mit leerzeichen getrennt

Kannst du eine Beispiel TXT anhängen?

Oben war es ja leerzeichen UND zeilenweise getrennt.
 
Die Formatierung ist eigentlich ohne leerzeichen. Die oben genannte Formatierung war nur ein Beispiel

Das Original sieht wie folgt aus:

xxxxx271120171345xxxxxxxxxxxxx
xxxxx271120171431xxxxxxxxxxxxx
xxxxx271120171549xxxxxxxxxxxxx

untereinander aufgereiht und ohne Leerzeichen.
 
Geht mit regex...schaue ich mir später an und schicke dir dann was was du mal testen kannst..
Ergänzung ()

Das ist der Code

Code:
$ExportFile = 'dein file'
 
$reader = New-Object System.IO.StreamReader ((Get-Item $ExportFile),[System.Text.Encoding]::GetEncoding('UTF-8')) #ggf die Kodierung anpassen
 
$regex_pattern = '([0-3][0-9][0,1][0-9][2][0-9][0-9][0-9])([0-2][0-9])([0-5][0-9])'
 
 
 try {
    for() 
            {
            $line = $reader.ReadLine()
            $match = $null

            if ($line -eq $null) { break }
            # process the line
 
            #prüfe auf Pattern
            $match = [regex]::Match($line,$regex_pattern)
    
 
            echo 'Originalwert:'
            echo ([int]$match.Groups[2].value)
            echo 'Um eins reduziert:'
            echo ([int]$match.Groups[2].value -1 )
            
 
            #echo $line
 
 
    }
  
}
finally {
    $reader.Close()
}


Und das wäre der Output:

Originalwert:
13
Um eins reduziert:
12
Originalwert:
14
Um eins reduziert:
13
Originalwert:
15
Um eins reduziert:
14

Passt das soweit??
 
Danke für die ausführliche Antwort, tut mir leid das ich erst jetzt schreibe.

Ich werde mir den Quellcode die nächsten Tage mal genauer anschauen!
 
Zurück
Oben