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

Mitglied: martinstein

martinstein (Level 1) - Jetzt verbinden

23.11.2011 um 13:49 Uhr, 3602 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
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 ...

VB for Applications

Inhalt einer Textbox in eine .txt Datei schreiben

gelöst Frage von Just4fun1990VB for Applications4 Kommentare

Hallo Administrator.de User, ich habe jetzt schon sehr lange gesucht und finde leider nichts. Hier allerdings habe ich gute ...

Neue Wissensbeiträge
Utilities
Teamviewer 14 Verbindungsprobleme mit Proxy
Tipp von PeterleB vor 2 StundenUtilities

Nach dem Umstieg von Version 13 auf 14 wollte sich TV nicht mehr mit dem Netz verbinden, ignorierte offenbar ...

Administrator.de Feedback
Unsere Datenbank wurde umgestellt
Information von Frank vor 5 StundenAdministrator.de Feedback4 Kommentare

Hallo User, ich habe in der Nacht unsere Datenbank umgestellt. D.h. neue Version (MySQL 8) und andere Örtlichkeit. Sollte ...

Sonstige Systeme
Es war einmal ein BeOS - Wer erinnert sich noch?
Information von BassFishFox vor 2 TagenSonstige Systeme6 Kommentare

Hallo, Bin gerade ueber Haiku gestolpert, von dessen Existenz als "Nachfolger des BeOS" ich wusste nur mich nie wirklich ...

Datenschutz

Microsoft und DSGVO - ob das wohl jemals klappt (Probleme beim Datenabfluss für Office Pro Plus)?

Tipp von VGem-e vor 2 TagenDatenschutz3 Kommentare

Servus Kollegen, siehe Aber wer setzt schon MS Office Pro Plus ein? Wie dann der Stand beim "normalen" MS ...

Heiß diskutierte Inhalte
Windows 10
Programm unter Windows 10 automatisch mit administrativen Rechten starten
Frage von GrafmulderWindows 1017 Kommentare

Hallo zusammen! Zur Situation: Ich benutze Windows 10 Pro für Workstations (Build 1803) mit zwei Konten. Einem Administratorkonto und ...

Windows Server
Cisco Annyconnect Secure Mobility Client - Windows2003 Server unable to connect
Frage von novregenWindows Server11 Kommentare

Von einem Windows 2003 Server soll eine Verbindung über Cisco Anyconnect Mobility Client zu einer Gegenstelle aufgebaut werden. Die ...

LAN, WAN, Wireless
Empfehlung Powerline Adapter
Frage von AgilolfingerLAN, WAN, Wireless11 Kommentare

Hallo Zusammen, ich brauche eine Empfehlung von euch. Ich möchte in einem privaten Haushalt eine Powerline Lösung einrichten. Allerdings ...

Microsoft
Schulungs-Microsoft-Konten zentral verwalten
Frage von thejarneMicrosoft9 Kommentare

Hallo zusammen, wir haben bei uns in der Firma 12 Computer-Arbeitsplätze für EDV-Schulungen, wo u.A. auch Computer-Basics-Kurse (wie verwende ...