melmacker
Goto Top

Text-Datei nach Zeilen durchsuchen die mehr oder weniger als eine offene Klammer "(" und eine geschlossene Klammer ")" haben

Hallo erstmal an alle die sich meiner Frage widmen.

Ich habe einen langen Code den ich in eine Text-Datei kopiert habe.
In jeder Zeile sollte eine offene Klammer "(" und eine geschlossene Klammer ")" stehen.
Da mir aber mein Programm jetzt sagt das da entweder eine Klammer zu viel oder zu wenig ist und ich keine Lust habe ca. 800 Zeilen per Hand abzuarbeiten, würde ich gerne wissen wie man das per Batch machen könnte.
Die Batch sollte eine Beispiel.txt durchsuchen in welcher Zeile sich entweder weniger als eine offene Klammer "(" und eine geschlossene Klammer ")" oder mehr als eine offene Klammer "(" und eine geschlossene Klammer ")" gibt und mir dann eine Rückmeldung gibt in der mir die Zeilennummer angezeigt wird.

Ich bedanke mich im voraus für jede Antwort
Mfg

Melmacker

Content-Key: 391751

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

Printed on: April 24, 2024 at 19:04 o'clock

Member: erikro
erikro Nov 06, 2018 at 08:50:00 (UTC)
Goto Top
Moin,

stehen die Klammern irgendwo in der Zeile oder immer am Anfang und am Ende? Dürfen innerhalb der Zeile auch noch weitere Klammern stehen oder nur die zwei?

Liebe Grüße

Erik
Member: Melmacker
Melmacker Nov 06, 2018 at 08:58:09 (UTC)
Goto Top
In jeder Zeile sollte nur am Anfang eine offene Klammer "(" und am Ende eine geschlossene Klammer ")" stehen.

Mfg

Melmacker
Member: erikro
erikro Nov 06, 2018 updated at 09:26:41 (UTC)
Goto Top
Moin,

Zitat von @Melmacker:

In jeder Zeile sollte nur am Anfang eine offene Klammer "(" und am Ende eine geschlossene Klammer ")" stehen.


Dann mit der Powershell als Einzeiler:

get-content .\klammern.txt -encoding utf8 | %{$count++; if(-not ($_ -match "^\({1,1}[^\(\)]*\){1,1}$")) {write-host "Die Zeile $count ist nicht ok"}}  

Wobei Du, falls Du das mehrmals auf derselben Shell ausführen willst, vorher ein $count=0 absetzen musst.

Oder als kleines Skript:

$arr_lines = get-content .\klammern.txt -encoding utf8 

foreach($line in $arr_lines) {

     if(-not ($line -match "^\({1,1}[^\(\)]*\){1,1}$")) {  

            write-host "Die Zeile" $( [array]::IndexOf($arr_lines, $line))  "ist nicht ok"  

    }

}

<edit> Ich habe den regex nochmal korrigiert, so dass auch auf innere Klammern geprüft wird.</edit>

hth

Erik
Member: Melmacker
Melmacker Nov 06, 2018 at 09:35:27 (UTC)
Goto Top
Ich habe mich mit Powershell noch nicht befasst.
Bei mir sehen die Zeilen so aus (x steht für ein Wort und y für eine Zahl/Buchstabe).

(setvar "x" y)

Und davon habe ich ca. 800 Zeilen.
Der oben stehende Code funktioniert bei mir nicht weil er setvar als Befehl in Powershell einließt.
Zumindest ermute ich das es daran liegt.
Kannst du mir da weiterhelfen?

Mfg

Melmacker
Mitglied: 137443
Solution 137443 Nov 06, 2018 updated at 09:54:59 (UTC)
Goto Top
Zitat von @Melmacker:
In jeder Zeile sollte nur am Anfang eine offene Klammer "(" und am Ende eine geschlossene Klammer ")" stehen.
Auch mit Batch kein Problem
findstr /ivn "^([^()]*)$" "d:\test.txt"  
Gruß
Member: erikro
erikro Nov 06, 2018 at 09:52:22 (UTC)
Goto Top
Moin,

Zitat von @Melmacker:

Ich habe mich mit Powershell noch nicht befasst.
Bei mir sehen die Zeilen so aus (x steht für ein Wort und y für eine Zahl/Buchstabe).

(setvar "x" y)

Und davon habe ich ca. 800 Zeilen.
Der oben stehende Code funktioniert bei mir nicht weil er setvar als Befehl in Powershell einließt.

Wenn der Text so aussieht:

(setvar "x" y)  
(setvar "x" y  
setvar "x" y)  
setvar "x" y  
(setvar ("x" y)  
(setvar "x") y)  
(setvar ("x") y)  

funktioniert das bei mir so wie gewünscht. Welche Fehlermeldung bekommst du denn?

Liebe Grüße

Erik
Mitglied: 137443
137443 Nov 06, 2018 updated at 09:56:13 (UTC)
Goto Top
Und mit der Powershell reicht auch das hier:
Select-String 'D:\test.txt' -Pattern '^\([^()]*\)$' -NotMatch | select -Expand LineNumber  
Member: Melmacker
Melmacker Nov 06, 2018 at 10:11:01 (UTC)
Goto Top
Danke @137443 genau das habe ich gesucht.

Mfg

Melmacker
Mitglied: 137443
137443 Nov 06, 2018 at 10:12:38 (UTC)
Goto Top
Kein Thema. face-wink
Member: Melmacker
Melmacker Nov 06, 2018 at 10:14:17 (UTC)
Goto Top
Auch dir Danke @eriko für deine Hilfe nur leider kenne ich mich nicht mit Powershell aus.
Tut mir leid.

Mfg

Melmacker
Member: erikro
erikro Nov 06, 2018 at 11:16:02 (UTC)
Goto Top
Zitat von @137443:

Und mit der Powershell reicht auch das hier:
> Select-String 'D:\test.txt' -Pattern '^\([^()]*\)$' -NotMatch | select -Expand LineNumber  
> 

Kühl! Wieder was gelernt.