Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Inhalt einer mehrere Zeilen umfassenden txt-Datei als Variable

Frage Entwicklung Batch & Shell

Mitglied: martinstein

martinstein (Level 1) - Jetzt verbinden

23.11.2011 um 13:49 Uhr, 3583 Aufrufe, 12 Kommentare

Hallo Leute,

Ich hab eine txt-Datei, die aus ein paar Zeilen besteht, in jeder Zeile stehen ein oder mehrere durch Leerzeichen getrennte Worte. In manchen Zeilen steht dasselbe. Beispieldatei:

das ist
ein Beispiel für
eine oben
geschilderte
Textdatei.
geschilderte
Textdatei.

- Wie kann ich die doppelten Zeilen von der Verarbeitung ausschließen?
- Wie kann ich den restlichen Inhalt dieser Datei als EINE Variable darstellen?
- Wie kann ich dabei die Zeilenumbrüche entfernen und durch Komma-Leerzeichen (, ) ersetzen?

Ich steh mal wieder tierisch auf dem Schlauch und bin dankbar für jede Hilfe!

Gruß

Martin
Mitglied: bastla
23.11.2011 um 19:32 Uhr
Hallo martinstein!

Wenn Du tatsächlich aus dem gesamten Inhalt eine einzige Zeile (ohne Wiederholungen) machen möchtest, dann im einfachsten Fall etwa so:
01.
@echo off & setlocal 
02.
set "Ein=D:\Textdatei.txt" 
03.
set "Var=, " 
04.
 
05.
for /f "usebackq delims=" %%i in ("%Ein%") do call :ProcessLine "%%i" 
06.
set "Var=%Var:~2,-2%" 
07.
set Var 
08.
goto :eof 
09.
 
10.
:ProcessLine 
11.
echo "%Var%"|findstr /c:", %~1, ">nul && goto :eof 
12.
set "Var=%Var%%~1, " 
13.
goto :eof
Es wird zunächst die Variable mit der Trennzeichensequenz Komma + Leerzeichen vorbelegt - so kann dann nachher für jede Zeile verglichen werden, ob sie in der Variablen bereits enthalten ist, ohne dass irrtümlich ein Teilstring ausgeschlossen würde - wenn etwa in Deiner Beispieldatei als letzte Zeile noch
oben
folgen würde, müsste eigentlich diese Zeile ebenfalls in das Ergebnis aufgenommen werden (vorher hieße es ja "eine oben"). Um dies zu erreichen, wird jeweils der Zeileninhalt mit Trennzeichen davor und danach verglichen - im Beispiel würde also nicht untersucht, ob sich "oben" schon in der Variablen befindet, sondern es wird (in Zeile 11) auf
, oben, 
geprüft. Je nach dem Ergebnis dieser Prüfung wird dann bei "Zeile ist bereits enthalten" sofort zurückge- und damit die Zeile übersprungen, oder an die Variable die Zeile + Trennzeichen angefügt.

Am Ende enthält die Variable daher jeweils am Anfang und am Ende die beiden Trennzeichen, weshalb sie per Teilstringbildung (Zeile 6 bedeutet: Verwende alles nach den ersten beiden Zeichen bis vor die letzten beiden Zeichen!) korrigiert werden muss.

Grüße
bastla
Bitte warten ..
Mitglied: rubberman
23.11.2011 um 20:53 Uhr
Hallo martinstein und hallo bastla!

Genauso, nur anders:
01.
@echo off &setlocal 
02.
set "Ein=D:\Textdatei.txt" 
03.
 
04.
setlocal enabledelayedexpansion &set "Var=, " 
05.
<"%Ein%" (for /f %%i in ('type "%Ein%"^|find /c /v ""') do for /l %%j in (1 1 %%i) do ( 
06.
  set /p "ln=" &echo "!Var!"|findstr /c:", !ln!, ">nul ||set "Var=!Var!!ln!, ") 
07.
08.
endlocal &set "Var=%Var:~2,-2%" 
09.
 
10.
set Var 
11.
pause
Der Code unterscheidet sich nicht wesentlich. Auch bastlas Version könnte ohne Subroutine auskommen, solang keine Ausrufezeichen in der Datei vorkommen. Unterschied ist, dass bei der SET /P Variante in meinem Code, trotz verzögerter Variablenerweiterung, Ausrufezeichen im Text nicht eliminiert werden.

Eine Anmerkung sollte aber noch kommen:
Strings dürfen nicht endlos lang sein!

Grüße
rubberman
Bitte warten ..
Mitglied: martinstein
23.11.2011 um 21:05 Uhr
Hallo bastla und rubberman,

ich hab echt Mühe, eure Codes aufzudröseln, aber: Es scheint zu funktionieren, vielen Dank!

In der Tat können keine Ausrufezeichen vorkommen, eine Sache aber: Ist mit String die Variable gemeint? Die kann nämlich evtl. über 204 Zeichen lang sein, wenn man die ganzen verschiedenen Zeilen zusammennimmt. Wär's irgendwie möglich, die Variable nach 204 Zeichen "abzuschneiden" oder macht das cmd evtl. von selbst? Dann fehlte zwar ein Teil, aber das wäre zu vernachlässigen.

Gruß

martin
Bitte warten ..
Mitglied: bastla
23.11.2011 um 21:12 Uhr
Hallo martinstein!

Da Du vermutlich nicht mehr NT4 verwendest, liegt die Grenze nicht bei 2047 Zeichen, sondern bei 8191 ...

Grüße
bastla
Bitte warten ..
Mitglied: rubberman
23.11.2011 um 21:14 Uhr
Hallo martinstein,

204 Zeichen sind mit Sicherheit noch kein Kriterium, über das du dir Sorgen machen müsstest. Folge einfach mal meinem Link, da steht etwas von 8191 Zeichen für XP. Ich glaube bei Vista und Win7 hat sich dieses Limit nicht geändert.

Grüße
rubberman

<EDIT zu spät />
Bitte warten ..
Mitglied: Biber
23.11.2011 um 21:16 Uhr
Moin martinstein,

die Längenbeschränkung ist nicht nicht 204, sondern mindestens 2047 (also 2048-1 bzw 2 hoch 12 minus ein Nullbyte)
Im Falle Windows-wie-immer-die-heutige-Zwischenversion-heisst auch durchaus das 4fache.

Wenn du damit auch nur in die Nähe eines möglichen Datenverlusts kommst--> dann nimm ein anderes Werkzeug.
Es gibt keinen "verschmerzbaren Datenverlust", jedenfalls nicht in diesem Seitenarm des Forums.

Ein paar andere Werkzeuge können wir auch zur Not bedienen.

Grüße
Biber
[Edit] ...doppelt zu spät ... [/Edit]
Bitte warten ..
Mitglied: martinstein
23.11.2011 um 21:27 Uhr
Hallo ihr drei,

sorry, es war mein Fehler - 2047 langt für meine Zwecke vollkommen!

Danke nochmal,

martin
Bitte warten ..
Mitglied: martinstein
14.12.2011 um 20:01 Uhr
Hallo Leute,

ich hab jetzt doch noch ein Problem entdeckt: Ganz selten steht in einer Zeile sowas wie

"text der zeile"

also mit Anführungszeichen vorn und hinten und dann zickt die Batch rum. Kann man das irgendwie umschiffen? Falls es das Skript vereinfacht: Ich kann programmseitig auch einrichten, dass die Anführungszeichen vorn und hinten nicht willkürlich, sondern in JEDER Zeile vorhanden sind. Weiterer Hinweis: An anderer Stelle als vorn und hinten kommen niemals Anführungszeichen vor.

Danke schonmal für eure Ratschläge!
Bitte warten ..
Mitglied: bastla
14.12.2011 um 21:42 Uhr
Hallo martinstein!

Es sollte in meinem Ansatz oben genügen, die Zeile 5 durch
for /f "usebackq delims=" %%i in ("%Ein%") do call :ProcessLine "%%~i"
zu ersetzen ...

Grüße
bastla
Bitte warten ..
Mitglied: martinstein
15.12.2011 um 20:34 Uhr
Hallo bastla,

danke für die Antwort. Da ich rubbermans subroutinefreie Lösung verbaut habe: Wie sähe es denn da aus? Es ist übrigens NICHT möglich, dass am Anfang zwei und am Ende zwei Anführungszeichen stehen, falls das die Sache weiter vereinfacht.

Gruß

Martin
Bitte warten ..
Mitglied: bastla
15.12.2011 um 20:46 Uhr
Hallo martinstein!

Versuch es mal mit der folgenden Zeile 6:
set /p "ln=" & set "ln=!ln:~1,-1!" &echo "!Var!"|findstr /c:", !ln!, ">nul ||set "Var=!Var!!ln!, ")
Grüße
bastla
Bitte warten ..
Mitglied: martinstein
15.12.2011 um 21:51 Uhr
Potzblitz! Jetzt ist es perfekt! Hier nochmal beide Varianten in der geänderten Form:

01.
@echo off & setlocal 
02.
set "Ein=D:\Textdatei.txt" 
03.
set "Var=, " 
04.
 
05.
for /f "usebackq delims=" %%i in ("%Ein%") do call :ProcessLine "%%~i" 
06.
set "Var=%Var:~2,-2%" 
07.
set Var 
08.
goto :eof 
09.
 
10.
:ProcessLine 
11.
echo "%Var%"|findstr /c:", %~1, ">nul && goto :eof 
12.
set "Var=%Var%%~1, " 
13.
goto :eof
und

01.
@echo off &setlocal 
02.
set "Ein=D:\Textdatei.txt" 
03.
 
04.
setlocal enabledelayedexpansion &set "Var=, " 
05.
<"%Ein%" (for /f %%i in ('type "%Ein%"^|find /c /v ""') do for /l %%j in (1 1 %%i) do ( 
06.
  set /p "ln=" & set "ln=!ln:~1,-1!" &echo "!Var!"|findstr /c:", !ln!, ">nul ||set "Var=!Var!!ln!, ") 
07.
08.
endlocal &set "Var=%Var:~2,-2%" 
09.
 
10.
set Var 
11.
pause
Danke nochmal und viele Grüße

Martin
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Batch - Bestimmter Inhalt einer Zeile aus einer txt oder ini als Variable
gelöst Frage von element22Batch & Shell2 Kommentare

Hallo zusammen, leider finde ich den Fehler nicht. Na gut, vielleicht sitzt er vorm Monitor, aber das ist etwas ...

PHP
TXT Datei auslesen und bestimmte Zeilen in Variable setzen
gelöst Frage von 126594PHP11 Kommentare

Hallo zusammen, vorweg muss ich sagen, ich bin (bis jetzt) absoluter Neuling was PHP angeht. Ich will aus einer ...

Batch & Shell
Inhalt einer .txt als eine Variable setzen mit Batch
gelöst Frage von AlexIOTBatch & Shell3 Kommentare

Hallo Zusammen, In der Variable.txt steht immer nur ein einziger Rechnername! - wie folgt: EW085IDFV001 Ich möchte das dieser ...

Batch & Shell
Batch: mehrere Zeilen (Blöcke) in einer txt Datei zu einer Variablen hinzufügen
Frage von pukassBatch & Shell9 Kommentare

Guten Abend zusammen! Bin neu hier und habe hier im Forum gesehen, dass sich einige gut in der batch ...

Neue Wissensbeiträge
Erkennung und -Abwehr

Necur-Botnet soll Erpressungstrojaner Scarab massenhaft verbreiten

Information von BassFishFox vor 10 StundenErkennung und -Abwehr

12,5 Millionen Spam-Mails aus einem Bot-Netz mit 6 Millionen Computern? Eigentlich eine schwache Leistung. Die Erpresser setzen dabei auf ...

Microsoft

Nadeldrucker-Problem unter Windows - Microsoft liefert Updates

Information von BassFishFox vor 10 StundenMicrosoft

Hat ja nicht lange gedauert. Nachdem die November-Updates für Windows 7, 8.1 und 10 zahlreiche Nadeldrucker lahmgelegt hatten, stellt ...

Linux

Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde

Information von Frank vor 18 StundenLinux14 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 1 TagBatch & Shell9 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Heiß diskutierte Inhalte
Windows Server
Kann man im KMS nachschauen , wieviele Clients den Key in Anspruch genommen haben
gelöst Frage von rainergugusWindows Server15 Kommentare

Hallo, wir haben einen KMS Windows 10 Key. Dieser ist ja W7 kompatibel. Aber unser Windows 7 Pool registriert ...

Linux
Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde
Information von FrankLinux14 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Router & Routing
Zwei Netzwerke erstellen
Frage von bunteblumeRouter & Routing14 Kommentare

Hallo Zusammen, Ich möchte gerne ein backup von einem bestimmten Folder welcher auf dem Server regelmässig synchronisiert wird auf ...

Off Topic
Fachkräftemangel in Deutschland? - Talentschmiede schreibt alle 2 Tage die gleichen Stellen aus
Frage von Penny.CilinOff Topic12 Kommentare

Hallo, haben wir in Deutschland Fachkräftemangel? Die Talentschmiede schreibt gefühlt alle zwei Tage dieselben Stellen aus. Und das schon ...