Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Wie kann man eine TXT Datei mit 2 Spalten durch Semikolon getrennt in Zeilen umwandeln, ähnlich einer Pivotdarstellung?

Frage Entwicklung Batch & Shell

Mitglied: viking

viking (Level 1) - Jetzt verbinden

16.07.2010, aktualisiert 18.10.2012, 5029 Aufrufe, 29 Kommentare

Hallo,
wer weiß für meine Frage eine Lösung?

Wie kann ich folgendes Lösen?

Ich habe eine TXT Datei mit dem Namen Test.txt auf c:\temp liegen.
Die Werte sind durch Komma getrennt.
Diese Datei hat folgenden Beispielaufbau.

A,C
A,H
A,G
A,A
A,F
B,A
B,F
B,G
C,H
D,J
D,K
D,L
D,M
D,N

und so weiter,

Die neue Datei soll nun ähnlich Pivot folgendes aussehen haben.

A=C;H;G;A;F;
B=A;F;G;
C=H;
D=J;K;L;M;N

Ist das irgendwie lösbar?
Wenn ja, wie?
Gibts eventuell einen Editor der so was kann?

Gruß viking
29 Antworten
Mitglied: mathe172
16.07.2010 um 21:53 Uhr
Hallo viking

Probiers mal hiermit (ungetestet):

01.
@echo on & setlocal enabledelayedexpansion 
02.
for /f "tokens=1,2 delims=," %%A in (C:\bat\test.txt) do ( 
03.
if not "%%A"=="!Aktuell!" ( 
04.
if not "!Entsprechungen!"=="" ( 
05.
echo !Aktuell!=!Entsprechungen!>>pivot.txt 
06.
Rem Nur Zur Kontrolle: 
07.
echo !Aktuell!=!Entsprechungen! 
08.
09.
set "Aktuell=%%A" 
10.
set "Entsprechungen=" 
11.
12.
set "Entsprechungen=!Entsprechungen!%%B;" 
13.
14.
if not "!Entsprechungen!"=="" ( 
15.
echo !Aktuell!=!Entsprechungen!>>pivot.txt 
16.
Rem Nur Zur Kontrolle: 
17.
echo !Aktuell!=!Entsprechungen! 
18.
19.
Rem Nur Zur Kontrolle: 
20.
pause


Mathe172

<edit>
Noch zwei Fehler gefunden, habs getestet und es funktioniert soweit, vorausgesetzt test.txt enthält das Zeug geordnet
</edit>
Bitte warten ..
Mitglied: viking
16.07.2010 um 23:06 Uhr
Hallo Mathe172,

funktioniert auch bei mir super.
Vielen Dank bis dahin!

Noch eine Frage und ein Erweiterungswunsch:

Zur Frage:
Wo definierst Du im Skript das "=" und an welcher Stelle den Strichpunkt.
Wo befindet sich mein Trenner, den ich gerne durch ein "@" ersetzten will.

Zum Erweiterungswunsch:

Ich habe nun nicht mehr 2 Spalten sondern 3 Spalten in meiner Textdatei, getrennt durch ein "@".
In der ersten Spalte befindet sich der Interpret.
In der zweiten Spalte der CD Name.
In der dritten Spalte der Titel.
Somit habe ich zum Beispiel in meiner Test.txt bei einem Interptet von welchem ich 10 CDs a 12 Lieder habe 120 Zeilen mit drei Spalten.
Nun wollte ich das in der From auf 10 Zeilen reduzieren.
wobei in der Spalte 1 immer der Interpret, in Spalte 2 der CD Name und dann die Titel.
Die Trennung sollte zwischen Spalte 1 und Spalte ein "=", zwischen Spalte 2 und Spalte 3 ein "!" sein. Die restliche Werte dann wieder ein ";".

Final soll das ganze dann in Excel, wobei ich mit Ultra Edit den Trenner "=" und "@" ersetzen kann.
Wenn Du natürlich mir die Punkte nennen kannst, wo der Trenner definiert ist wäre noch besser.


Wenn das auch noch funktioniert, dann wäre das gigantisch.

Gruß viking
Bitte warten ..
Mitglied: bastla
16.07.2010 um 23:10 Uhr
@mathe172
funktioniert soweit, vorausgesetzt test.txt enthält das Zeug geordnet
... was sich ja durch folgende Zeile 2 sicherstellen ließe:
for /f "tokens=1,2 delims=," %%A in ('sort<C:\bat\test.txt') do (
Grüße
bastla
Bitte warten ..
Mitglied: bastla
16.07.2010 um 23:36 Uhr
Hallo viking!

Soferne es kein "<" oder ">" oder "|" in den Daten gibt, könnte das so gehen:
01.
@echo off & setlocal 
02.
set "Ein=Lang.txt" 
03.
set "Aus=Kurz.txt" 
04.
 
05.
del "%Aus%" 2>nul 
06.
set "Zuletzt=" 
07.
for /f "tokens=1-3 delims=@" %%a in ('sort^<"%Ein%"') do call :ProcessLine "%%a=%%b" "%%c" 
08.
REM  Nein, hier fehlt kein "goto :eof" ;-) 
09.
 
10.
:ProcessLine 
11.
if defined Zuletzt if "%Zuletzt%"==%1 set "Zeile=%Zeile%;%~2" & goto :eof 
12.
if defined Zuletzt >>"%Aus%" echo %Zeile:&=^&% 
13.
set "Zeile=%~1!%~2" 
14.
set "Zuletzt=%~1" 
15.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: LotPings
16.07.2010 um 23:47 Uhr
Hallo viking,

hier noch eine kompakte Alternative die ohne Sort funktioniert mit Environment Variablen.
Undokumentiert und auch nicht ganz einfach zu verstehen
01.
@echo off 
02.
Type NUL >Pivot.txt 
03.
For /F "delims==" %%A in ('Set X_ 2^>NUL') Do Set "%%A=" 
04.
For /F "tokens=1,2 delims=," %%A in (test.txt) do Call Set "X_%%A=%%X_%%A%%%%B;" 
05.
For /F "delims=" %%A in ('Set X_ 2^>NUL') Do set "X=%%A"&>>"Pivot.txt" call Echo.%%X:~2%%
Die Eingangsdatei test.txt in Zeile 4 und die pivot.txt in Z2 und Z5 nach Bedarf anpassen.

Gruß
LotPings

Oh wie lieben wir doch diese vereinfachten Beispiele, die dann, nachdem die Katze aus dem Sack ist, ganz andere Lösungen erfordern.
Bitte warten ..
Mitglied: bastla
16.07.2010 um 23:55 Uhr
Hallo LotPings!

Hybsch

In der weniger vorsichtigen Version ließe sich die Zeile 3 noch durch ein "setlocal" vorweg ersetzen ...
Undokumentiert ...
Undokumentiert? Würde ich nieeee machen ... (ok, fast nieeee )
... und auch nicht ganz einfach zu verstehen
... mir fällt auch außer "Dictionary" praktisch nix dazu ein ...

Grüße
bastla

[Edit]
Oh wie lieben wir doch diese vereinfachten Beispiele, die dann, nachdem die Katze aus dem Sack ist, ganz andere Lösungen erfordern.
Da hatte ich die "Gnade des späten Einstiegs" ...
[/Edit]
Bitte warten ..
Mitglied: LotPings
17.07.2010 um 00:19 Uhr
Zitat von bastla:
Hallo LotPings!
Hallo Wach Bastla
Hybsch
Danke
In der weniger vorsichtigen Version ließe sich die Zeile 3 noch durch ein "setlocal" vorweg ersetzen ...
Aber die Fors sehen doch so schick aus
> Undokumentiert ...
Undokumentiert? Würde ich nieeee machen ... (ok, fast nieeee )
> ... und auch nicht ganz einfach zu verstehen
... mir fällt auch außer "Dictionary" praktisch nix dazu ein ...
Ich meine ja die hochprozentige Batterie in Zeile 4

Gute Nacht für Heute, hier hats gerade etwas geregnet und man schlafen .......
Bitte warten ..
Mitglied: bastla
17.07.2010 um 00:27 Uhr
Hallo LotPings!
Ich meine ja die hochprozentige Batterie in Zeile 4
Ich doch auch (mit %%A als Key des "Dictionary") ...

Gute Nacht
bastla
Bitte warten ..
Mitglied: Biber
17.07.2010 um 00:41 Uhr
Also nee, Leute,

mit diesem Beitrag habe ich mehrfacher Hinsicht Schwierigkeiten...

Ich versuch es mal vorsichtig herzuleiten.

Wenn du, viking, hier wie in deinem Eroffnungsbeitrag eine vollkommen kontextfreie Knobelaufgabe stellst,
bei der ein gequirlt aussehender Input in einen etwas gefällig erscheinenderen Output gepresst werden soll...

Okay, ist eine nette Knobelaufgabe zum freitagabendlichen Chillout...
Und da fragt auch keiner weiter groß danach, was das denn für ein Spiel ist oder woher und wohin die Daten gehen.

Heraus kommt dann genau das gleiche wie bei diesen Sonntagsbeilage-Rätseln mit dem römischen Ziffern aus Streichhölzern ("Legen Sie eines der Hölzchen um, damit die Gleichung stimmt..")

So weit, so gut... und dabei ist es mir als Moderator auch Recht, wenn bastla und/oder LotPings (deren Kommentare ich sehr schätze) hier Lösungen posten, die "super funktionieren" , aber nur von denjenigen nachvollzogen werden können, die die Aufgabe auch selbst hätten lösen können.
[Edit] "...deren Kommentare ich schätze" bezieht nicht nur auf "Kommentare im Schnipsel", sondern auch auf "Antworten auf Fragen". [/Edit]

Für dich, viking, mag kurzfristig so eine Out-of-the-box-Lösung die ersten 5 Minuten ganz toll sein . läuft ja.
Anderen Mitlesern nützt es eh nix, weil die Aufgabe absurd ist und die Lösung nebulös.

Ab der 6ten Minute -sobald auch eine einzige Zeile anzupassen ist - stehst du mit dem gleichen Wissen davor, das du vorher hattest.

Von daher möchte darauf hinweisen, dass ich natürlich auch (Batch/Skript-)Fragen hinnehme, die nach dem Motto gestellt werden:
"Ich hab mal was zum Knobeln, ich sag nicht woher und wofür und will auch gar nicht wissen, wie und warum die Lösung funktioniert."

Aber dann werde ich auch, nachdem das anfänglich formulierte Problem mit zwei, drei oder fünf kompakten Experten-Zeilen weggelasert wurde den Beitrag auf "Beantwortet" und "Geschlossen" setzen.

Und nicht zulassen, dass dann noch mehr und mehr Anforderungen/Erweiterungen/Sonderlocken nachgeschoben werden.

Denn damit wird implizit eingefordert, dass dem Fragesteller hier eine professionelle Individuallösung rundum-sorglos und schlüsselfertig frei Haus zusammengeschrotet wird, ohne dass er eine Zeile davon verstanden haben musst, ohne einen Cent dazu zubezahlen und dann noch auftreten kann mit "Dein Code funktioniert aber noch nicht - da musst du noch was berichtigen."

Das kann nicht das sein, was wir hier vermitteln wollen.
Ziel des Forums sollte doch eher sein, den noch etwas Ungeübteren Hilfestellung und Laufsicherheit zu geben.

Irgendwelchen Rentnern, die sich nicht übern Zebrastreifen trauen, würdet ihr doch auch nicht dadurch helfen, dass ihr ihnen euer Skateboard leiht, damit sie es schneller schaffen. Oder noch einen kleinen Schubs gebt, damit sie schon mal die Hälfte der Fahrbahn geschafft haben.

Grüße
Biber
Bitte warten ..
Mitglied: viking
17.07.2010 um 00:45 Uhr
Also nun kapier ich überhaupt nichts mehr ????, weil ich den Code von Euch nicht verstehe.

Meine Daten erhalte ich aus Access und da kann ich vieles anstellen und definieren, aber kein Pivot mit Werten als Daten.
Und Excel hilft mir auch nicht weiter.
Daher die ursrünglich Frage ob es mit Textadteien funktioniert und eben zunächst mit 2 Spalten.

Da dies kein Problem war, "kam die Katze aus dem Sack" und es existieren auf einmal drei Spalten.

Könnte ich daher bitte nocheinmal für die finale Komplettlösung einen einzigen kompletten Code haben, der nun nur einen wie unten beschriebenen Wunsch löst.



Ich habe nun 3 Spalten in meiner Textdatei, getrennt durch ein "@" mit dem Namen Test.txt auf dem Pfad c:\bat\test.txt
In der ersten Spalte befindet sich der Interpret.
In der zweiten Spalte der CD Name.
In der dritten Spalte der Titel.
Somit habe ich zum Beispiel in meiner Test.txt bei einem Interptet von welchem ich 10 CDs a 12 Lieder habe 120 Zeilen mit drei Spalten.
Nun wollte ich das in der Form auf 10 Zeilen reduzieren.
wobei in der Spalte 1 immer der Interpret, in Spalte 2 der CD Name und dann die Titel.
Der Trenner für die Datensätze innherlab der Zeilen soll der einfachheit halber nur ein ";" sein.

Nur als Alternativlösung:
Die Trennung sollte zwischen Spalte 1 und Spalte ein "=", zwischen Spalte 2 und Spalte 3 ein "!" sein. Die restliche Werte dann wieder ein ";".


Gruß viking
Bitte warten ..
Mitglied: bastla
17.07.2010, aktualisiert 18.10.2012
Hallo viking!

Kurzfassung:
LotPings hat einen Vorschlag für Dein "Einstiegsbeispiel" nachgereicht,
meine Variante für die "eigentliche Zielsetzung" könntest Du ja mal antesten, um zu sehen, ob ich das, was Du (ohne Beispieldaten für "vorher" / "nachher") nur verbal beschrieben hast, richtig verstanden habe - falls ja (auch @Biber), werde ich gerne meine paar Zeilen auch entsprechend kommentieren / erklären ...

Grüße
bastla
Bitte warten ..
Mitglied: viking
17.07.2010, aktualisiert 18.10.2012
Zitat von bastla:
Hallo viking!

Kurzfassung:
LotPings hat einen Vorschlag für Dein "Einstiegsbeispiel" nachgereicht,
meine Variante für die "eigentliche
Zielsetzung" könntest Du ja mal antesten, um zu sehen, ob ich das, was Du (ohne Beispieldaten für
"vorher" / "nachher") nur verbal beschrieben hast, richtig verstanden habe - falls ja (auch @Biber), werde ich
gerne meine paar Zeilen auch entsprechend kommentieren / erklären ...

Grüße
bastla

Hallo bastla,

testen tu ich sehr gerne, allerdings bin ich mittlerweile sehr sehr verwirrt.
Ich beziehe mich auf Deinen Code 16.07.2010, 23:36:18 Uhr
Diesen kopiere ich in eine Datei mit der Endung. cmd in das Verzeichnis c:\temp
Frage: wie muss in Deinem Code meine Datei heißen und wo muss die liegen?
Ich gehe davon aus auch in C:\temp und nenne sie Test.txt
Welches Trennzeichen und wievile "Spalten", 2 oder 3 ?
Ich gehe davon aus drei Spalten mit "@" als Trenner.

Ist das richtig?

Gurß viking
Bitte warten ..
Mitglied: bastla
17.07.2010 um 01:19 Uhr
Hallo viking!

Die Zeilen 2 und 3 sollen der leichteren Anpassbarkeit dienen - Du kannst dort auch vollständige Pfade der Art
set "Lang=c:\bat\test.txt"
angeben (ich hatte nur, da es sich mittlerweile ja um andere Daten handeln sollte, auch die Textdatei anders als jene des "Einstiegsbeispiels" benannt) ...
Ich gehe davon aus drei Spalten mit "@" als Trenner.
So hatte ich Deine Beschreibung gelesen ...

Grüße
bastla
Bitte warten ..
Mitglied: mathe172
17.07.2010 um 14:25 Uhr
Hallo zusammen!

Also Viking, falls es dich noch interessiert, versuchs mal damit:

01.
@echo off & setlocal enabledelayedexpansion 
02.
for /f "tokens=1-3 delims=@" %%A in (C:\bat\test.txt) do ( 
03.
if not "!Interpret_jetzt!"=="%%A" ( 
04.
if not "!CDs!"=="" ( 
05.
call :CD_neu 
06.
echo !Interpret_jetzt!=!CDs!>>pivot.txt 
07.
set "CDs=" 
08.
set "CD_jetzt=" 
09.
10.
set "Interpret_jetzt=%%A" 
11.
12.
if not "!CD_jetzt!"=="%%B" ( 
13.
if not "!Titel!"=="" ( 
14.
call :CD_neu 
15.
16.
set "CD_jetzt=%%B" 
17.
18.
 
19.
set "Titel=!Titel!;%%C" 
20.
21.
 
22.
set "CDs=!CDs!!CD_jetzt!!Titel!*" 
23.
echo !Interpret_jetzt!=!CDs!>>pivot.txt 
24.
 
25.
:CD_neu 
26.
set "CDs=!CDs!!CD_jetzt!!Titel!*" 
27.
set "Titel=" 
28.
goto :eof
Das "!" als Trennzeichen funktioniert nicht sonst geht aber so ziehmlich alles.

Zeile2: Nach "delims=" steht jetzt ein "@". Bei anderem Trennzeichen hier austauschen
Zeile6: Zwischen "!Interpret_jetzt!" und "!CDs!" steht das "="-Trennzeichen
Zeile22+27: Nach dem "!Titel!" steht ein "*". Bei anderem Trennzeichen beide austauschen
Zeile19: Vor "%%C" steht das ";"-Trennzeichen

Das Sortzeug funktioniert bei mir nicht.

Mathe172
Bitte warten ..
Mitglied: schnutzibaer
18.07.2010 um 23:56 Uhr
Hi,
ich hab Deine Einstiegsnachricht gelesen, und es geht wohl einfach um eine Format-Konvertierung. Ich hatte nicht die Zeit, sämtliche Antworten dazu zu lesen, zumal einige davon nicht zielführend waren.
Solche kleinen Konvertierungsaufgaben habe ich immer mit meiner altbewährten (DOS)-Clipper-Programmiersprache erledigt.
Wenn Du mir ganz konkret das Ausgangsformat und das gewünschte Zielformat erklärst, kriegst Du das (erste) Konvertierungsprogramm kostenlos. Dabei sind Dir keine Grenzen gesetzt, Du mußt nur genau wissen, wie Quell- und Zielformat aussehen sollen. Voraussetzung: Du kannst noch ein DOS.Programm starten.

Mit freundlichen Grüßen

Schnutzibär
Bitte warten ..
Mitglied: viking
19.07.2010 um 00:18 Uhr
Zitat von bastla:
Hallo viking!

Die Zeilen 2 und 3 sollen der leichteren Anpassbarkeit dienen - Du kannst dort auch vollständige Pfade der Art
set "Lang=c:\bat\test.txt" 
> 
angeben (ich hatte nur, da es sich mittlerweile ja um andere Daten handeln sollte, auch die Textdatei anders als jene des
"Einstiegsbeispiels" benannt) ...
> Ich gehe davon aus drei Spalten mit "@" als Trenner.
So hatte ich Deine Beschreibung gelesen ...

Grüße
bastla

Hallo bastla,

Ich war mit Deiner Version schon am verzweifeln, ..., weil sich bei der gar nichts getan hat, im Gegensatz zu den anderen Lösungen.
Nun bin ich aber diesem Problem etwas näher gerückt.
Ich habe an meinem Rechner mit Win7 64 bit getestet.
Da tut sich nichts.

Ich habe das ganze dann in einer VMWare mit WinXP 32 bit getestet, da funktioniert es wunderbar !?

Fazit:
Deine Lösung ist spitze, aber wie kann ich die unter Win7 64 bit zum laufen bringen?

Die anderen *.cmd Dateien haben auch unter Win7 64 bit funktioniert.

Woran liegt das?

Gruß viking
Bitte warten ..
Mitglied: Biber
19.07.2010 um 00:23 Uhr
Moin viking,

aus gegebenem Anlass - nach schnutzibaers Angebot - stehen jetzt die (auch von mir etwas wortreicher formulierten) Alternativen für dich zur freien Auswahl.

  • entweder eine Rundum-Sorglos-Fertiglösung zum Doppelklicken mit einer Hotline-Mailadresse der Programmierers für Änderungswünsche
  • oder ein beispielhaftes skizzenhaftes Entwickeln einer Strategie, eines Algorithmus zum Verstehen und Selber-Feinschleifen

Es steht dir vollkommen frei, welchen Weg du wählst, aber nochmals meine Bitte:

Falls du dich entscheiden möchtest für "Will gar nicht wissen, wie es funktioniert... interessiert mich bei meinem Toaster auch nicht, solange er toastet.." und den Rest über PN abwickelst...

--> dann lass es mich bitte wissen, damit wir hier einen Haken dran machen....

Grüße
Biber
P.S.
. . und ich könnte, wenn wir diese ver###ten 250 CD-Titel in Oracle importieren auch eine kleine APEX-Lösung beisteuern...
Spatzen, die mit Kanonen erlegt werden, können zartfühlende Mitmenschen zu Vegetariern werden lassen.
Bitte warten ..
Mitglied: viking
19.07.2010 um 00:26 Uhr
Zitat von mathe172:
Hallo zusammen!

Also Viking, falls es dich noch interessiert, versuchs mal damit:

01.
> @echo off & setlocal enabledelayedexpansion 
02.
> for /f "tokens=1-3 delims=@" %%A in (C:\bat\test.txt) do ( 
03.
> if not "!Interpret_jetzt!"=="%%A" ( 
04.
> if not "!CDs!"=="" ( 
05.
> call :CD_neu 
06.
> echo !Interpret_jetzt!=!CDs!>>pivot.txt 
07.
> set "CDs=" 
08.
> set "CD_jetzt=" 
09.
> ) 
10.
> set "Interpret_jetzt=%%A" 
11.
> ) 
12.
> if not "!CD_jetzt!"=="%%B" ( 
13.
> if not "!Titel!"=="" ( 
14.
> call :CD_neu 
15.
> ) 
16.
> set "CD_jetzt=%%B" 
17.
> ) 
18.
>  
19.
> set "Titel=!Titel!;%%C" 
20.
> ) 
21.
>  
22.
> set "CDs=!CDs!!CD_jetzt!!Titel!*" 
23.
> echo !Interpret_jetzt!=!CDs!>>pivot.txt 
24.
>  
25.
> :CD_neu 
26.
> set "CDs=!CDs!!CD_jetzt!!Titel!*" 
27.
> set "Titel=" 
28.
> goto :eof 
29.
> 
Das "!" als Trennzeichen funktioniert nicht sonst geht aber so ziehmlich alles.

Zeile2: Nach "delims=" steht jetzt ein "@". Bei anderem Trennzeichen hier austauschen
Zeile6: Zwischen "!Interpret_jetzt!" und "!CDs!" steht das "="-Trennzeichen
Zeile22+27: Nach dem "!Titel!" steht ein "*". Bei anderem Trennzeichen beide austauschen
Zeile19: Vor "%%C" steht das ";"-Trennzeichen

Das Sortzeug funktioniert bei mir nicht.

Mathe172


Hallo Mathe172,

hab die Version gerade getestet,
Es kommt schon was raus, mit der Einschränkung, dass kein Zeilenumbruch bei einer neuen CD für einen Interpreten erfolgt.
Meinst Du das mit dem "Sortzeug"?
Etwas verwunderlich für mich ist nun, das Dein Code mit einer Mathe172.cmd bei mir nunter Win7 64 bit läuft und der Code von bastla nicht.
Der geht nur unter WinXP.

Gruß viking.
Bitte warten ..
Mitglied: viking
19.07.2010 um 01:04 Uhr
Zitat von Biber:
Moin viking,

aus gegebenem Anlass - nach schnutzibaers Angebot - stehen jetzt die (auch von mir etwas wortreicher formulierten) Alternativen
für dich zur freien Auswahl.

  • entweder eine Rundum-Sorglos-Fertiglösung zum Doppelklicken mit einer Hotline-Mailadresse der Programmierers für
Änderungswünsche
  • oder ein beispielhaftes skizzenhaftes Entwickeln einer Strategie, eines Algorithmus zum Verstehen und Selber-Feinschleifen

Es steht dir vollkommen frei, welchen Weg du wählst, aber nochmals meine Bitte:

Falls du dich entscheiden möchtest für "Will gar nicht wissen, wie es funktioniert...
interessiert mich bei meinem Toaster auch nicht, solange er toastet.."
und den Rest über PN abwickelst...

--> dann lass es mich bitte wissen, damit wir hier einen Haken dran machen....

Grüße
Biber
P.S.
. . und ich könnte, wenn wir diese ver###ten 250 CD-Titel in Oracle importieren auch eine kleine APEX-Lösung
beisteuern...

Spatzen, die mit Kanonen erlegt werde, können zartfühlenden Mitmenschen zu Vegetarieren werden lassen.




Hallo Biber,

mir wurde nach den ersten Antworten meiner Erweiterung zu meiner Frage bewußt, dass es ein fataler Fehler ist, Erweiterungen oder Modifikationen, auch wenn Sie noch so klein sein sollten zu einer bereits gelösten Frage zu stellen.
Das war dumm von mir, da die Lösungsvorschläge mich selbst sehr verwirrt und irritiert haben.
Ich werde zukünftig davon Abstand nehmen.

Die grundsätzliche erste Frage war für mich bereits mit der ersten Lösung von mathe172 perfekt.

Die Modifikation durch die Lösung von bastla auch, mit der Einschränkung, das diese sich bei mir nur unter WinXP 32 bit und nicht unter Win7 64 bit ausführen läßt?
Frage:
Sollte ich da ein extra Thema draus machen?, oder gibts für das schon eine Antwort im Forum?

Eine Rundum Sorglos Lösung will ich nicht, da ich eigentlich mit der Frage etwas lernen wollte, aber wie ich erkennen muss ist, ist dass bei mir wohl ein Fass ohne Boden.

Die Hilfestellung und die Lösungen, welche die crack's hier beigesteuert haben finde ich fantastisch.


Danke und Gruß viking
Bitte warten ..
Mitglied: Biber
19.07.2010 um 08:46 Uhr
Moin viking,

danke für deine Antwort.
Gestern abend haben wir beide ja relativ zeitgleich, aber aneinander vorbei gepostet.

Wir werden mal versuchen, diesen Thread hier (mit möglichst allen Unterthreads) hier zu Ende zu bringen.

Ist nun leider etwas zerfahren, dieser Beitrag, aber wir bekommen es schon hin.

Drei Lösungsansätze vom Mathe172, bastla und LotPings liegen ja schon vor und ein viertes Lösungsangebot.

Das merkwürdige (andere) Verhalten des bastla-Schnipsels unter Win7 sollten wir auch hier versuchen zu klären -
mindesten einen Workaround sollten wir da schon finden.

Worum es mir ging und geht in meinen Zwischenkommentaren - ich vertrete die Ansicht, dass durch unsere kleinen Scripting-Vorturnereien vorrangig Anregungen zur Entwicklung von Lösungsstrategien und Strukturierung von mehr oder minder komplexen Aufgabenstellungen "aus dem Alltag" sein sollten.

Deshalb finde ich es nicht so schön, wenn Knobelaufgaben ohne sofort erkennbaren Realitätsbezug hier weggezaubert werden.
Hat sich ja inzwischen alles halbwegs normaiisiert in diesem Beitrag - zu dem Zeitpunkt, an dem ich mich hier eingemengt habe, war es noch unklarer (zumindest für mich).

Ich mische mich mich jetzt wieder aber unter die Zuschauer.

Grüße
Biber
Bitte warten ..
Mitglied: bastla
19.07.2010 um 09:28 Uhr
Hallo @All!
Das merkwürdige (andere) Verhalten des bastla-Schnipsels unter Win7 sollten wir auch hier versuchen zu klären -
Sehe ich auch so - mein Beitrag zur Klärung:
01.
Interpret1@CD1@Lied1 
02.
Interpret1@CD1@Lied2 
03.
Interpret1@CD1@Lied4 
04.
Interpret1@CD1@Lied5 
05.
Interpret2 & 3@CD2@Lied2 & so 
06.
Interpret1@CD1@Lied6 
07.
Interpret1@CD2@Lied1 
08.
Interpret1@CD2@Lied2 
09.
Interpret2 & 3@CD2@Lied4 
10.
Interpret1@CD2@Lied3 
11.
Interpret1@CD2@Lied4 
12.
Interpret2 & 3@CD1@Lied1 
13.
Interpret2 & 3@CD1@Lied2 
14.
Interpret2 & 3@CD1@Lied3 
15.
Interpret2 & 3@CD2@Lied1 
16.
Interpret2 & 3@CD2@Lied3 
17.
Interpret1@CD1@Lied3
als "Lang.txt" (andere Testdaten hatte ich nicht) liefert mit
01.
@echo off & setlocal 
02.
set "Ein=Lang.txt" 
03.
set "Aus=Kurz.txt" 
04.
 
05.
del "%Aus%" 2>nul 
06.
set "Zuletzt=" 
07.
for /f "tokens=1-3 delims=@" %%a in ('sort^<"%Ein%"') do call :ProcessLine "%%a=%%b" "%%c" 
08.
REM  Nein, hier fehlt kein "goto :eof" ;-) 
09.
 
10.
:ProcessLine 
11.
if defined Zuletzt if "%Zuletzt%"==%1 set "Zeile=%Zeile%;%~2" & goto :eof 
12.
if defined Zuletzt >>"%Aus%" echo %Zeile:&=^&% 
13.
set "Zeile=%~1!%~2" 
14.
set "Zuletzt=%~1" 
15.
goto :eof
unter 7_64Bit
01.
Interpret1=CD1!Lied1;Lied2;Lied3;Lied4;Lied5;Lied6 
02.
Interpret1=CD2!Lied1;Lied2;Lied3;Lied4 
03.
Interpret2 & 3=CD1!Lied1;Lied2;Lied3 
04.
Interpret2 & 3=CD2!Lied1;Lied2 & so;Lied3;Lied4
als "Kurz.txt" ...

Grüße
bastla
Bitte warten ..
Mitglied: viking
19.07.2010 um 11:19 Uhr
Zitat von bastla:
Hallo @All!
> Das merkwürdige (andere) Verhalten des bastla-Schnipsels unter Win7 sollten wir auch hier versuchen zu klären -
Sehe ich auch so - mein Beitrag zur Klärung:
01.
Interpret1@CD1@Lied1 
02.
> Interpret1@CD1@Lied2 
03.
> Interpret1@CD1@Lied4 
04.
> Interpret1@CD1@Lied5 
05.
> Interpret2 & 3@CD2@Lied2 & so 
06.
> Interpret1@CD1@Lied6 
07.
> Interpret1@CD2@Lied1 
08.
> Interpret1@CD2@Lied2 
09.
> Interpret2 & 3@CD2@Lied4 
10.
> Interpret1@CD2@Lied3 
11.
> Interpret1@CD2@Lied4 
12.
> Interpret2 & 3@CD1@Lied1 
13.
> Interpret2 & 3@CD1@Lied2 
14.
> Interpret2 & 3@CD1@Lied3 
15.
> Interpret2 & 3@CD2@Lied1 
16.
> Interpret2 & 3@CD2@Lied3 
17.
> Interpret1@CD1@Lied3 
18.
> 
als "Lang.txt" (andere Testdaten hatte ich nicht) liefert mit
01.
@echo off & setlocal 
02.
> set "Ein=Lang.txt" 
03.
> set "Aus=Kurz.txt" 
04.
>  
05.
> del "%Aus%" 2>nul 
06.
> set "Zuletzt=" 
07.
> for /f "tokens=1-3 delims=@" %%a in ('sort^<"%Ein%"') do call :ProcessLine "%%a=%%b" 
08.
> "%%c" 
09.
> REM  Nein, hier fehlt kein "goto :eof" ;-) 
10.
>  
11.
> :ProcessLine 
12.
> if defined Zuletzt if "%Zuletzt%"==%1 set "Zeile=%Zeile%;%~2" & goto :eof 
13.
> if defined Zuletzt >>"%Aus%" echo %Zeile:&=^&% 
14.
> set "Zeile=%~1!%~2" 
15.
> set "Zuletzt=%~1" 
16.
> goto :eof 
17.
> 
unter 7_64Bit
01.
Interpret1=CD1!Lied1;Lied2;Lied3;Lied4;Lied5;Lied6 
02.
> Interpret1=CD2!Lied1;Lied2;Lied3;Lied4 
03.
> Interpret2 & 3=CD1!Lied1;Lied2;Lied3 
04.
> Interpret2 & 3=CD2!Lied1;Lied2 & so;Lied3;Lied4 
05.
> 
als "Kurz.txt" ...

Grüße
bastla


Hallo bastla,

da es bei Dir wohl auch unter Win7 64 bit funktioniert, sehe ich Frage grundsätzlich als gelöst an.
Da es bei mir aber unter Win7 64 bit Ultimate noch nicht ganz tut, habe ich nun eine neue Beitrag eingestellt.

Thema:
Umgebungsvariable unter WIn7 Ultimate 64 bit für cmd änderen.
Vielleicht liegt es daran, dass bei mir Umgebungsvariablen im System nicht so sind wie sie sein sollten.

Würde mich freuen, wenn Du mich in dem Beitrag auch unterstützen könntest.

Danke vinking
Bitte warten ..
Mitglied: bastla
19.07.2010 um 11:50 Uhr
Hallo viking!

Werde ich mir gerne ansehen, allerdings betrachte ich diese Frage hier weiterhin als offen - magst Du daher vielleicht die Testedatei "Lang.txt" mit den von mir geposteten Daten erzeugen, in der ersten Batchzeile aus dem "echo off" ein "echo on" machen und dann den Batch direkt von der Kommandozeile starten - dann siehst Du nämlich, welche Befehle wie ausgeführt werden.

Zur Sicherheit könntest Du auch noch in den Zeilen 2 und 3 vollständige Pfade angeben - also etwa:
set "Ein=D:\Testdaten\Lang.txt"
[Edit] Die Informationen aus dem Folgethread lassen vermuten, dass der Batch an der "Nicht-Auffindbarkeit" der "sort.exe" scheitert (ließe sich testen, indem in Zeile 7 anstelle von "sort" der vollständige Pfad "C:\Windows\System32\sort" verwendet wird )... [/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: mathe172
19.07.2010 um 22:50 Uhr
Zitat von viking:
> Zitat von mathe172:
> ----
Hallo Mathe172,

hab die Version gerade getestet,
Es kommt schon was raus, mit der Einschränkung, dass kein Zeilenumbruch bei einer neuen CD für einen Interpreten
erfolgt.
Meinst Du das mit dem "Sortzeug"?
Etwas verwunderlich für mich ist nun, das Dein Code mit einer Mathe172.cmd bei mir nunter Win7 64 bit läuft und der Code
von bastla nicht.
Der geht nur unter WinXP.

Gruß viking.

Hallo Viking!

Das hier sollte tun(hab die Frage falsch verstanden...):
01.
@echo off & setlocal enabledelayedexpansion 
02.
for /f "tokens=1-3 delims=@" %%A in (C:\bat\test.txt) do ( 
03.
if not "!Interpret_jetzt!"=="%%A" ( 
04.
call :CD_neu 
05.
set "CD_jetzt=" 
06.
set "Interpret_jetzt=%%A" 
07.
08.
if not "!CD_jetzt!"=="%%B" ( 
09.
call :CD_neu 
10.
set "CD_jetzt=%%B" 
11.
12.
set "Titel=!Titel!%%C;" 
13.
14.
 
15.
:CD_neu 
16.
if not "!Titel!"=="" ( 
17.
echo !Interpret_jetzt!=!CD_jetzt!*!Titel!>>pivot.txt 
18.
set "Titel=" 
19.
20.
goto :eof
Mit dem "Sortzeug" meine ich den Sortierbefehl, den Blasta vorgeschlagen hat

Mathe172
Bitte warten ..
Mitglied: bastla
19.07.2010, aktualisiert 18.10.2012
Hallo mathe172!
Mit dem "Sortzeug" meine ich den Sortierbefehl, den Blasta vorgeschlagen hat
Soferne bei Dir die "sort.exe" problemlos aufgerufen werden kann, wäre doch nur eine kleine Ergänzung in Zeile 2 nötig:
for /f "tokens=1-3 delims=@" %%A in ('sort^<C:\bat\test.txt') do (
- dann sieht auch mit meinen (durchgemischten) Testdaten von oben das Ergebnis vernünftig aus (eben getestet) ...
Noch ein Nachtrag:
Wenn Du trotz "delayedExpansion" das Trennzeichen "!" verwenden willst, könntest Du das Unterprogramm etwa so modifizieren (unter Berücksichtigung des Sonderzeichens "&"):
01.
:CD_neu 
02.
if "%Titel%"=="" goto :eof 
03.
setlocal disabledelayedexpansion 
04.
echo %Interpret_jetzt:&=^&%=%CD_jetzt:&=^&%!%Titel:&=^&%>>pivot.txt 
05.
endlocal 
06.
set "Titel=" 
07.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: mathe172
21.07.2010 um 18:12 Uhr
Hallo bastla!

Danke für den Tipp. Aber könntest du mir bitte erklären, was diese Schreibweise in Zeile 4 macht? So was hab ich noch nie gesehen

Mathe172
Bitte warten ..
Mitglied: Biber
21.07.2010 um 18:53 Uhr
Moin mathe172,

bastla und Lotpings haben in den letzten Tagen erklärt und erläutert und kommentiert, als hätten sie irgendetwas nachzuholen...

Da spring ich mal kurz ein versuchsweise.
Zitat von mathe172:
Hallo bastla!

Danke für den Tipp. Aber könntest du mir bitte erklären, was diese Schreibweise in Zeile 4 macht?
So was hab ich noch nie gesehen
Na ja - aber richtig vermisst wohl auch noch nie...

bastla hat das Zusammenspiel der Zeilen 3 und 4 aufgezeigt für den Fall, dass neben "zu maskierenden Steuerzeichen" auch noch das implizite Sonderzeichen "!" berücksichtigt werden muss.
Das Ausrufungszeichen ist eigentlich unkritisch in Bätchen, allerdings erhält es eine spezielle Bedeutung, wenn "DelayedExpansion" angesagt wurde,
"DelayedExpansion" ermöglicht das Setzen UND Auslesen einer Variablen in einer Befeilszeile, was bei "Befehlszeilen", die aus ein oder mehreren IF() bzw. FOR-Anweisungen bestehen recht nützlich ist.

Ein Beispielfall, der bei CDs und Interpreten und Tracks durchaus nix Besonderes ist, wäre
  • Interpret enthält zu maskierendes Zeichen Ampersand ("Simon & Garfunkel")
  • oder die CD enthält ein Ampersand "Bonnie & Clyde"
  • oder aber der Track enthält ein Ampersand "Don't Drink & Drive"

Die allgemeine Schreibweise für "Ersetze mir im Variableninhalt von %variable% jedes X durch ein U....
Set %variable:X=U%
Wenn alle Ampersands "&" durch maskierte Ampersands "^&" ersetzt werden:
Set %variable:&=^&%

In bastlas Beispiel mal NICHT LAUFFÄHIG, aber optisch lesbarer in getrennten Zeilen
REM echo %Interpret_jetzt:&=^&%=%CD_jetzt:&=^&%!%Titel:&=^&%>>pivot.txt 
echo %Interpret_jetzt:&=^&% 
                            =  
                              %CD_jetzt:&=^&%  
                                                  %Titel:&=^&% 
                                                     >>pivot.txt  
....
Und es funktioniert eben auch, falls in Tracks oder Albumnamen auch "!" enthalten sind.

Grüße
Biber
Bitte warten ..
Mitglied: bastla
21.07.2010 um 19:36 Uhr
@Biber: Danke für's Einspringen (ich vermeide sowas ja nach Möglichkeit )
Und es funktioniert eben auch, falls in Tracks oder Albumnamen auch "!" enthalten sind.
... weil zum Zeitpunkt der Ausgabe "DelayedExpansion" kurzfristig abgesagt ist (bewirkt durch die Zeilen 3 und 5) ...

Grüße
bastla
Bitte warten ..
Mitglied: mathe172
21.07.2010 um 21:47 Uhr
Hallo Biber!

Danke für die Erklärung, ich glaub(oder hoffe zumindest),dass ich es verstanden habe. Das mit der ersetzung kann ich sicher mal brauchen

Mathe172
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Einzelne Zeilen in txt Datei speichern und auslesen (7)

Frage von noah1400 zum Thema Batch & Shell ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Webentwicklung
gelöst HTML Output in eine txt Datei mit VisualBasicScript (2)

Frage von coca22COCA zum Thema Webentwicklung ...

Batch & Shell
Merkwürdige Zeilenformatierung in txt Datei (3)

Frage von miczar zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...