Batch oder Powershell für .txt Datei

batch_prog

Cadet 1st Year
Dabei seit
März 2017
Beiträge
14
#1
Moin, moin,

ich bin gerade auf der Suche nach einem Batch oder einem Powershell-Befehl mit ich nachfolgendes bewirken kann;

Eine bestehende längere .txt welche wie folgt aufgebaut ist:

Code:
test;test;test;test;[1x Leerzeichen]
[neue zeile durch eingabe]
die Werte hier sind nur Beispielhaft; ich suche schon länger nach einem "Codeschnipsel" der "das leerzeichen und die neue zeile durch eingabe" entfernt; jemand eine Idee?

Beste Grüße,
batch_prog!
 

Rage

Lt. Commander
Dabei seit
Feb. 2009
Beiträge
1.170
#2
Du meinst mit neue Zeile durch Eingabe eine Leerzeile? Mir würde als erstes awk einfallen, da kommt es jetzt aber genauer darauf an was Du genau machen willst.
 

batch_prog

Cadet 1st Year
Ersteller dieses Themas
Dabei seit
März 2017
Beiträge
14
#3
Moin Rage,
ja.

Das Programm aus dem der .txt Export kommt fügt der Datei nach dem letzten ';' noch ein Leerzeichen und eine neue Zeile hinzu. Das kann ich aber für die Weiterverarbeitung nicht nutzen. Dadurch bin ich auf der Suche das über ein Batch o.ä. zu entfernen, da die Datei immer etwas größer ist.
 

Rage

Lt. Commander
Dabei seit
Feb. 2009
Beiträge
1.170
#4
Nochmal: Die Zeile die da hinzugefüht wird ist eine Leerzeile? Leerzeilen kann man ganz fix und ohne Probleme mit awk aus beliebigen Dateien rauslöschen. Das letzte Leerzeichen könnte schwieriger werden. Um leere Zeilen zu entfernen machst Du das hier in der bash oder Powershell oder irgendwo anders, wo man awk haben kann:

Code:
awk -F „;“ 'NF > 0' <filename.txt>
Ohne zusätzliche Anweisung gibt awk standardmaßig den eingelesenen Inhalt aus; awk liest zeilenweise. NF ist die Anzahl Felder (bzw. Spalten) pro eingelesene Zeile, NR gibt die Anzahl bis jetzt eingelesener Zeilen. Eventuell kann man das benutzen um in der vorangegangenen Zeile das letzte Feld zu löschen, wenn es keine feste Anzahl Spalten geben sollte, ansonsten könnte man aus jeder Eingabe nur die feste Anzahl Spalten ausgeben. Dazu brauche ich mehr Infos.

Wie verarbeitest Du denn die Tabelle? Gibts es irgendwie eine feste Anzahl an Spalten außer dann, wenn das Leerzeichen draufkommt?
 

pizza4ever

Lt. Commander
Dabei seit
Apr. 2009
Beiträge
1.459
#5
Die aufgabe ist nicht 100%.

Allgemein gesagt sollt es aber lösbar sein durch Powershell und dann der Verwendung des .net FileReaders... ggf. braucht man noch RegEx

Für weiter Informationen braucht man im Idealfall Beispieldaten und eine genaue Erklärung.
 
Zuletzt bearbeitet:

Yuuri

Fleet Admiral
Dabei seit
Okt. 2010
Beiträge
11.658
#6
In PowerShell ganz einfach:
Code:
Get-Content file.txt | ? { ![string]::IsNullOrWhiteSpace( $_ ) } | % { $_.Trim() } > out.txt
 

pizza4ever

Lt. Commander
Dabei seit
Apr. 2009
Beiträge
1.459
#7
Kryptischer hättest du es aber auch nicht schreiben können oder? ;)

get-content ist halt sau lahm bei größeren Textdateien, da wäre dann der .net filereader zu bevorzugen
 

Yuuri

Fleet Admiral
Dabei seit
Okt. 2010
Beiträge
11.658
#8
Kryptischer hättest du es aber auch nicht schreiben können oder?
Warum? PowerShell ist zum Pipen gemacht. Ich könnte es höchsten unleserlicher machen und ? durch Where-Object und % durch ForEach-Object ersetzen.
get-content ist halt sau lahm bei größeren Textdateien, da wäre dann der .net filereader zu bevorzugen
Wer keine Angaben zum Inhalt macht, bekommt auch nicht mehr.
Code:
$infile = [IO.File]::OpenRead( "file.txt" )
$outfile = [IO.File]::OpenWrite( "out.txt" )
$reader = New-Object System.IO.StreamReader( $infile, [Text.Encoding]::UTF8, $true, 4096 )
$writer = New-Object System.IO.StreamWriter( $outfile, (New-Object System.Text.UTF8Encoding( $false )), 4096, $false )
while( $null -ne ($line = $reader.ReadLine()) )
{
	if( ![string]::IsNullOrWhiteSpace( $line ) )
	{
		$writer.WriteLine( $line.Trim() )
	}
}
$reader.Close()
$writer.Close()
 
Top