thomas86
Goto Top

Powershell replace befehl?

Ich bin absoluter neuling mit powershell und versuche folgende Probleme in den griff zu bekommen.

Ich versuche eine txt dateien mit Powershell zu verändern und zwar muss folgendes verändert werden

1. Am ende jeder Zeile brfindet sich ein " ; " und das muss weg

2. die Erste Zeile soll gelöscht werden

bisher habe ich nur das hier


$Quelle="U:\Documents\DATEI.txt"
$Ziel="U:\Documents\DATEI.neu.txt"
$Datei = Get-ChildItem $Quelle
foreach ($String in $Datei)
{

$Inhalt = Get-Content -Path $String


$Inhalt | foreach {$_ -replace ";"," "}| Out-File -FilePath $Ziel -encoding Default
}

Das problem ist es verändert alle Smikolons.

Und wie man die erste Zeile löscht weis ich absolut nicht

Vielen Dank für eure hilfe

Content-Key: 168696

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

Printed on: April 26, 2024 at 11:04 o'clock

Member: TsukiSan
TsukiSan Jun 27, 2011 at 14:38:10 (UTC)
Goto Top
Hallo Thomas86,

ich kann dir nur indirekt helfen bezüglich Powershell, weil ich damit nicht arbeite.
1. Am ende jeder Zeile brfindet sich ein " ; " und das muss weg
Normalerweise kennen diese Scriptsprachen etwas wie:
MeinText = "blablabla ;"  
if Right$(MeinText, 1) = ";" then MeinText = Left$(MeinText, (Len(MeinText) -1))  
o.s.ä.

2. die Erste Zeile soll gelöscht werden
auch bei Powershell müßte es etwas geben, womit man eine Datei komplett einlesen kann und dann die erste Zeile ausradiert.
Beispiel in anderer Scriptsprache:
MeineZeilen = Split(FSO.opentextfile(MeineDatei).ReadAll,vbcrlf)
For i = 1 to Ubound(MeineZeilen)
           Write (blablabla(i))
Next
.close
'etc  

eventuell hilt dir das etwas weiter, sich mit Powershell auseinander zu setzen. Suche dir die Befehle raus, wie sie bei Powershell lauten
also: Split , LEFT oder RIGHT etc. , dann müßte es leicht funktionieren.

Das problem ist es verändert alle Smikolons.
Das hat der Replace-Befehl so ansich face-wink

Gruss
Tsuki
Member: Thomas86
Thomas86 Jun 27, 2011 at 14:53:57 (UTC)
Goto Top
MeinText = "blablabla ;"

Das kann ich so einfach nicht definieren, da der Text an sich 100.000 zeilen hat, er soll mit die txt datei als eine neue txt datei ausgeben.
Und die befehle Left und Right finde ich nicht.


01.MeineZeilen = Split(FSO.opentextfile(MeineDatei).ReadAll,vbcrlf)
02.For i = 1 to Ubound(MeineZeilen)
03. Write (blablabla(i))
04.Next
05..close
06.'etc

hier weiß ich auch nicht wie das mit dem Write(blablabla(i)) bei einem so großen text funktionieren soll?

Aber danke du hast mir schonmal stoff gegeben zu rumprobieren.

Was halt gut wäre, wenn ich es irgendwie in meinen Zeilein (siehe frage) einbringen kann
Member: TsukiSan
TsukiSan Jun 27, 2011 at 15:08:16 (UTC)
Goto Top
Hallo Thomas86,

nochmal: ich kann dir bei den direkten Befehlen in Powershell nicht helfen, da ich sie nicht weiß.
du weißt da weitaus mehr!
Mach folgendes:
Datei öffnen und splitten und als SplitMerkmal nimmst du den Zeilenumbruch
Das ganze schreibt sich dann in eine Variable, welche ein Array sein müßte.
Nun hast du alle Zeilen in einem Array (von mir aus 100.000 Zeilen -> Ubound von diesem Array wäre dann 99.999)
Dann checkst du jede Zeile einzeln und entfernst ganz rechts das Zeichen ; , falls vorhanden.
Zum Schluss schreibst du die Daten in deine neue Datei und fängst ganz einfach bei 1 an zu starten,
weil die Arrays fangen bei NULL an!
Dann hast du alle Fliegen mit einer Klappe erschlagen!
In Powershell kann ich dir's nicht aufschreiben. Aber eventuell mal ein Beispiel in VBS:
Dim FSO
Dim DateiOriginal , DateiNeu
DateiOriginal = "U:\Documents\DATEI.txt"  
DateiNeu = "U:\Documents\DATEI.neu.txt"   

Set FSO = CreateObject("Scripting.FileSystemObject")  
MeineZeilen = Split(FSO.opentextfile(DateiOriginal).ReadAll,vbcrlf) ' vbcrlf = Zeilenumbruch!  

For i = 1 to Ubound(MeineZeilen) ' somit fangen wir bei Zeile 2 erst an, mitzuschreiben!  
      temp = MeineZeilen(i)
      if Right(temp, 1) = ";" then temp = Left(temp, (Len(temp) -1))  
      temp = temp & vbcrlf
Next

MeineDateiNeu = FSO.CreateTextFile(DateiNeu,True).Write (temp)
Ungetestet und nur als Beispiel gedacht!!!!

Gruss
Tsuki
Member: mathe172
mathe172 Jun 27, 2011 at 15:21:29 (UTC)
Goto Top
Hallo,

für das Replacen der ; hätte ich eine Idee, auch wenn ich mich nicht so mit Powershell auskenne:
Man könnte einfach sagen er soll alle Sekimkolons gefolgt von einem Zeilenumbruch/CrLf/010 013 (oder umgekehrt) durch einen simplen Zeilenumbruch ersetzen.
Also etwa MeinText.Replace(";" & vbcrlf,vbcrlf) in Powershellcode

Mathe172
Member: bastla
bastla Jun 27, 2011 at 15:27:23 (UTC)
Goto Top
@tsuki
Anstatt immer den gesamten "temp"-String behandeln zu müssen würde ich nur die jeweilige Zeile kürzen, also etwa:
For i = 1 to Ubound(MeineZeilen) ' somit fangen wir bei Zeile 2 erst an, mitzuschreiben!       
    L = Len(MeineZeilen(i))
    If Right(MeineZeilen(i), 1) = ";" Then L = L - 1  
    temp = temp & Left(MeineZeilen(i), L) & vbCrLf
Next
Ansonsten hätte der Vorschlag von mathe172 einiges für sich (besonders, wenn es um 100.000 Zeilen geht) ...

Grüße
bastla
Member: TsukiSan
TsukiSan Jun 27, 2011 at 15:37:59 (UTC)
Goto Top
@bastla,
joh, das geht auch einfacher face-wink Da gebe ich dir Recht! Danke für den Hinweis!
@mathe172
auch 'ne super Idee! Das stimmt! Warum nicht gleich das rechte Semiklolon in einen Zeilenumbruch verwandeln.
Noch einfacher face-smile

Wenn der TO jetzt noch jemanden findet, der unsere Ideen nach Powershell konvertiert, ist er sicher ganz glücklich face-smile

Gruss
Tsuki
Member: Thomas86
Thomas86 Jun 27, 2011 at 15:40:07 (UTC)
Goto Top
Wie TsukiDan richtig erkannt hat bin ich grade am verrückt werden um es in Powershell zu konvertieren,

ich selber bekomme nur error zu lesen face-sad
Member: Thomas86
Thomas86 Jun 27, 2011 at 16:53:06 (UTC)
Goto Top
Also ich hab jetzt das Problem

Nr. 2 gelöst und zwar so

$Quelle="U:\Documents\PRDO.helaba_Fallback_out.txt"
get-content $Quelle |
select -Skip 1 |
set-content "$Quelle-temp"
move "$Quelle-temp" $Quelle -Force

Das Problem Nr. 1

Da bin ich jetzt die schiene von Mathe172 gefahren, allerdings habe ich einen befehl gefunden mit dem ich sagen kann, dass er das letzte zeichen löschen soll, dass
sieht dann so aus

$Quelle="U:\Documents\PRDO.helaba_Fallback_out.txt"
$Ziel="U:\Documents\PRDO.helaba_Fallback_out_kon.txt"

get-Content $Quelle |

foreach-object {$_.TrimEnd(';')| Out-File -FilePath $Ziel}


Das problem das ich jetzt habe ist, dass er mir die änderung nur für die letzte zeile ausspuckt und die andern löscht er dannach

Ich müsste etwas an der Out-File ändern oder so, könnt ihr mir da nochmal helfen, aber dieses mal ohne drei "!!!" hehe

vielen Dank