viking
Goto Top

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

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

Content-Key: 147078

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

Printed on: April 16, 2024 at 05:04 o'clock

Member: mathe172
mathe172 Jul 16, 2010 at 19:53:50 (UTC)
Goto Top
Hallo viking

Probiers mal hiermit (ungetestet):

@echo on & setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=," %%A in (C:\bat\test.txt) do (  
if not "%%A"=="!Aktuell!" (  
if not "!Entsprechungen!"=="" (  
echo !Aktuell!=!Entsprechungen!>>pivot.txt
Rem Nur Zur Kontrolle:
echo !Aktuell!=!Entsprechungen!
)
set "Aktuell=%%A"  
set "Entsprechungen="  
)
set "Entsprechungen=!Entsprechungen!%%B;"  
)
if not "!Entsprechungen!"=="" (  
echo !Aktuell!=!Entsprechungen!>>pivot.txt
Rem Nur Zur Kontrolle:
echo !Aktuell!=!Entsprechungen!
)
Rem Nur Zur Kontrolle:
pause


Mathe172

<edit>
Noch zwei Fehler gefunden, habs getestet und es funktioniert soweit, vorausgesetzt test.txt enthält das Zeug geordnet
</edit>
Member: viking
viking Jul 16, 2010 at 21:06:10 (UTC)
Goto Top
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
Member: bastla
bastla Jul 16, 2010 at 21:10:36 (UTC)
Goto Top
@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
Member: bastla
bastla Jul 16, 2010 at 21:36:18 (UTC)
Goto Top
Hallo viking!

Soferne es kein "<" oder ">" oder "|" in den Daten gibt, könnte das so gehen:
@echo off & setlocal
set "Ein=Lang.txt"  
set "Aus=Kurz.txt"  

del "%Aus%" 2>nul  
set "Zuletzt="  
for /f "tokens=1-3 delims=@" %%a in ('sort^<"%Ein%"') do call :ProcessLine "%%a=%%b" "%%c"  
REM  Nein, hier fehlt kein "goto :eof" ;-)  

:ProcessLine
if defined Zuletzt if "%Zuletzt%"==%1 set "Zeile=%Zeile%;%~2" & goto :eof  
if defined Zuletzt >>"%Aus%" echo %Zeile:&=^&%  
set "Zeile=%~1!%~2"  
set "Zuletzt=%~1"  
goto :eof
Grüße
bastla
Mitglied: 77559
77559 Jul 16, 2010 at 21:47:22 (UTC)
Goto Top
Hallo viking,

hier noch eine kompakte Alternative die ohne Sort funktioniert mit Environment Variablen.
Undokumentiert und auch nicht ganz einfach zu verstehen face-wink
@echo off
Type NUL >Pivot.txt
For /F "delims==" %%A in ('Set X_ 2^>NUL') Do Set "%%A="  
For /F "tokens=1,2 delims=," %%A in (test.txt) do Call Set "X_%%A=%%X_%%A%%%%B;"  
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.
Member: bastla
bastla Jul 16, 2010 at 21:55:11 (UTC)
Goto Top
Hallo LotPings!

Hybsch face-smile

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 face-wink)
... und auch nicht ganz einfach zu verstehen face-wink
... 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" ... face-wink
[/Edit]
Mitglied: 77559
77559 Jul 16, 2010 at 22:19:56 (UTC)
Goto Top
Zitat von @bastla:
Hallo LotPings!
Hallo Wach Bastla face-wink
Hybsch face-smile
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 face-smile
> Undokumentiert ...
Undokumentiert? Würde ich nieeee machen ... (ok, fast nieeee face-wink)
> ... und auch nicht ganz einfach zu verstehen face-wink
... mir fällt auch außer "Dictionary" praktisch nix dazu ein ...
Ich meine ja die hochprozentige Batterie in Zeile 4 face-wink

Gute Nacht für Heute, hier hats gerade etwas geregnet und man schlafen .......
Member: bastla
bastla Jul 16, 2010 at 22:27:34 (UTC)
Goto Top
Hallo LotPings!
Ich meine ja die hochprozentige Batterie in Zeile 4 face-wink
Ich doch auch (mit %%A als Key des "Dictionary") ...

Gute Nacht
bastla
Member: Biber
Biber Jul 16, 2010 at 22:41:54 (UTC)
Goto Top
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
Member: viking
viking Jul 16, 2010 at 22:45:35 (UTC)
Goto Top
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
Member: bastla
bastla Jul 16, 2010, updated at Oct 18, 2012 at 16:42:52 (UTC)
Goto Top
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
Member: viking
viking Jul 16, 2010, updated at Oct 18, 2012 at 16:42:52 (UTC)
Goto Top
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
Member: bastla
bastla Jul 16, 2010 at 23:19:32 (UTC)
Goto Top
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
Member: mathe172
mathe172 Jul 17, 2010 at 12:25:29 (UTC)
Goto Top
Hallo zusammen!

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

@echo off & setlocal enabledelayedexpansion
for /f "tokens=1-3 delims=@" %%A in (C:\bat\test.txt) do (  
if not "!Interpret_jetzt!"=="%%A" (  
if not "!CDs!"=="" (  
call :CD_neu
echo !Interpret_jetzt!=!CDs!>>pivot.txt
set "CDs="  
set "CD_jetzt="  
)
set "Interpret_jetzt=%%A"  
)
if not "!CD_jetzt!"=="%%B" (  
if not "!Titel!"=="" (  
call :CD_neu
)
set "CD_jetzt=%%B"  
)

set "Titel=!Titel!;%%C"  
)

set "CDs=!CDs!!CD_jetzt!!Titel!*"  
echo !Interpret_jetzt!=!CDs!>>pivot.txt

:CD_neu
set "CDs=!CDs!!CD_jetzt!!Titel!*"  
set "Titel="  
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
Member: schnutzibaer
schnutzibaer Jul 18, 2010 at 21:56:30 (UTC)
Goto Top
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.

MfG

Schnutzibär
Member: viking
viking Jul 18, 2010 at 22:18:30 (UTC)
Goto Top
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
Member: Biber
Biber Jul 18, 2010 at 22:23:56 (UTC)
Goto Top
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.
Member: viking
viking Jul 18, 2010 at 22:26:15 (UTC)
Goto Top
Zitat von @mathe172:
Hallo zusammen!

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

> @echo off & setlocal enabledelayedexpansion
> for /f "tokens=1-3 delims=@" %%A in (C:\bat\test.txt) do (  
> if not "!Interpret_jetzt!"=="%%A" (  
> if not "!CDs!"=="" (  
> call :CD_neu
> echo !Interpret_jetzt!=!CDs!>>pivot.txt
> set "CDs="  
> set "CD_jetzt="  
> )
> set "Interpret_jetzt=%%A"  
> )
> if not "!CD_jetzt!"=="%%B" (  
> if not "!Titel!"=="" (  
> call :CD_neu
> )
> set "CD_jetzt=%%B"  
> )
> 
> set "Titel=!Titel!;%%C"  
> )
> 
> set "CDs=!CDs!!CD_jetzt!!Titel!*"  
> echo !Interpret_jetzt!=!CDs!>>pivot.txt
> 
> :CD_neu
> set "CDs=!CDs!!CD_jetzt!!Titel!*"  
> set "Titel="  
> 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


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.
Member: viking
viking Jul 18, 2010 at 23:04:14 (UTC)
Goto Top
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
Member: Biber
Biber Jul 19, 2010 at 06:46:46 (UTC)
Goto Top
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
Member: bastla
bastla Jul 19, 2010 at 07:28:49 (UTC)
Goto Top
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:
Interpret1@CD1@Lied1
Interpret1@CD1@Lied2
Interpret1@CD1@Lied4
Interpret1@CD1@Lied5
Interpret2 & 3@CD2@Lied2 & so
Interpret1@CD1@Lied6
Interpret1@CD2@Lied1
Interpret1@CD2@Lied2
Interpret2 & 3@CD2@Lied4
Interpret1@CD2@Lied3
Interpret1@CD2@Lied4
Interpret2 & 3@CD1@Lied1
Interpret2 & 3@CD1@Lied2
Interpret2 & 3@CD1@Lied3
Interpret2 & 3@CD2@Lied1
Interpret2 & 3@CD2@Lied3
Interpret1@CD1@Lied3
als "Lang.txt" (andere Testdaten hatte ich nicht) liefert mit
@echo off & setlocal
set "Ein=Lang.txt"  
set "Aus=Kurz.txt"  

del "%Aus%" 2>nul  
set "Zuletzt="  
for /f "tokens=1-3 delims=@" %%a in ('sort^<"%Ein%"') do call :ProcessLine "%%a=%%b" "%%c"  
REM  Nein, hier fehlt kein "goto :eof" ;-)  

:ProcessLine
if defined Zuletzt if "%Zuletzt%"==%1 set "Zeile=%Zeile%;%~2" & goto :eof  
if defined Zuletzt >>"%Aus%" echo %Zeile:&=^&%  
set "Zeile=%~1!%~2"  
set "Zuletzt=%~1"  
goto :eof
unter 7_64Bit
Interpret1=CD1!Lied1;Lied2;Lied3;Lied4;Lied5;Lied6
Interpret1=CD2!Lied1;Lied2;Lied3;Lied4
Interpret2 & 3=CD1!Lied1;Lied2;Lied3
Interpret2 & 3=CD2!Lied1;Lied2 & so;Lied3;Lied4
als "Kurz.txt" ...

Grüße
bastla
Member: viking
viking Jul 19, 2010 at 09:19:07 (UTC)
Goto Top
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:
Interpret1@CD1@Lied1
> Interpret1@CD1@Lied2
> Interpret1@CD1@Lied4
> Interpret1@CD1@Lied5
> Interpret2 & 3@CD2@Lied2 & so
> Interpret1@CD1@Lied6
> Interpret1@CD2@Lied1
> Interpret1@CD2@Lied2
> Interpret2 & 3@CD2@Lied4
> Interpret1@CD2@Lied3
> Interpret1@CD2@Lied4
> Interpret2 & 3@CD1@Lied1
> Interpret2 & 3@CD1@Lied2
> Interpret2 & 3@CD1@Lied3
> Interpret2 & 3@CD2@Lied1
> Interpret2 & 3@CD2@Lied3
> Interpret1@CD1@Lied3
> 
als "Lang.txt" (andere Testdaten hatte ich nicht) liefert mit
@echo off & setlocal
> set "Ein=Lang.txt"  
> set "Aus=Kurz.txt"  
> 
> del "%Aus%" 2>nul  
> set "Zuletzt="  
> for /f "tokens=1-3 delims=@" %%a in ('sort^<"%Ein%"') do call :ProcessLine "%%a=%%b"  
> "%%c"  
> REM  Nein, hier fehlt kein "goto :eof" ;-)  
> 
> :ProcessLine
> if defined Zuletzt if "%Zuletzt%"==%1 set "Zeile=%Zeile%;%~2" & goto :eof  
> if defined Zuletzt >>"%Aus%" echo %Zeile:&=^&%  
> set "Zeile=%~1!%~2"  
> set "Zuletzt=%~1"  
> goto :eof
> 
unter 7_64Bit
Interpret1=CD1!Lied1;Lied2;Lied3;Lied4;Lied5;Lied6
> Interpret1=CD2!Lied1;Lied2;Lied3;Lied4
> Interpret2 & 3=CD1!Lied1;Lied2;Lied3
> Interpret2 & 3=CD2!Lied1;Lied2 & so;Lied3;Lied4
> 
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
Member: bastla
bastla Jul 19, 2010 at 09:50:44 (UTC)
Goto Top
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
Member: mathe172
mathe172 Jul 19, 2010 at 20:50:21 (UTC)
Goto Top
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...):
@echo off & setlocal enabledelayedexpansion
for /f "tokens=1-3 delims=@" %%A in (C:\bat\test.txt) do (  
if not "!Interpret_jetzt!"=="%%A" (  
call :CD_neu
set "CD_jetzt="  
set "Interpret_jetzt=%%A"  
)
if not "!CD_jetzt!"=="%%B" (  
call :CD_neu
set "CD_jetzt=%%B"  
)
set "Titel=!Titel!%%C;"  
)

:CD_neu
if not "!Titel!"=="" (  
echo !Interpret_jetzt!=!CD_jetzt!*!Titel!>>pivot.txt
set "Titel="  
)
goto :eof

Mit dem "Sortzeug" meine ich den Sortierbefehl, den Blasta vorgeschlagen hat

Mathe172
Member: bastla
bastla Jul 19, 2010, updated at Oct 18, 2012 at 16:42:54 (UTC)
Goto Top
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) ... face-smile
Noch ein Nachtrag:
Wenn Du trotz "delayedExpansion" das Trennzeichen "!" verwenden willst, könntest Du das Unterprogramm etwa so modifizieren (unter Berücksichtigung des Sonderzeichens "&"):
:CD_neu
if "%Titel%"=="" goto :eof  
setlocal disabledelayedexpansion
echo %Interpret_jetzt:&=^&%=%CD_jetzt:&=^&%!%Titel:&=^&%>>pivot.txt
endlocal
set "Titel="  
goto :eof
Grüße
bastla
Member: mathe172
mathe172 Jul 21, 2010 at 16:12:33 (UTC)
Goto Top
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
Member: Biber
Biber Jul 21, 2010 at 16:53:30 (UTC)
Goto Top
Moin mathe172,

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

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
Member: bastla
bastla Jul 21, 2010 at 17:36:12 (UTC)
Goto Top
@Biber: Danke für's Einspringen face-smile (ich vermeide sowas ja nach Möglichkeit face-wink)
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
Member: mathe172
mathe172 Jul 21, 2010 at 19:47:42 (UTC)
Goto Top
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 face-smile

Mathe172