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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 147078
Url: https://administrator.de/forum/wie-kann-man-eine-txt-datei-mit-2-spalten-durch-semikolon-getrennt-in-zeilen-umwandeln-aehnlich-einer-147078.html
Ausgedruckt am: 10.01.2025 um 11:01 Uhr
29 Kommentare
Neuester Kommentar
Hallo viking
Probiers mal hiermit (ungetestet):
Mathe172
<edit>
Noch zwei Fehler gefunden, habs getestet und es funktioniert soweit, vorausgesetzt test.txt enthält das Zeug geordnet
</edit>
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>
@mathe172
Grüße
bastla
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 (
bastla
Hallo viking!
Soferne es kein "<" oder ">" oder "|" in den Daten gibt, könnte das so gehen:
Grüße
bastla
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
bastla
Hallo viking,
hier noch eine kompakte Alternative die ohne Sort funktioniert mit Environment Variablen.
Undokumentiert und auch nicht ganz einfach zu verstehen
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.
hier noch eine kompakte Alternative die ohne Sort funktioniert mit Environment Variablen.
Undokumentiert und auch nicht ganz einfach zu verstehen
@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%%
Gruß
LotPings
Oh wie lieben wir doch diese vereinfachten Beispiele, die dann, nachdem die Katze aus dem Sack ist, ganz andere Lösungen erfordern.
Hallo LotPings!
Hybsch
In der weniger vorsichtigen Version ließe sich die Zeile 3 noch durch ein "
Grüße
bastla
[Edit]
[/Edit]
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]
Hallo Wach Bastla
Gute Nacht für Heute, hier hats gerade etwas geregnet und man schlafen .......
Hybsch
DankeIn der weniger vorsichtigen Version ließe sich die Zeile 3 noch durch ein "
Aber die Fors sehen doch so schick aus 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 "
Ich meine ja die hochprozentige Batterie in Zeile 4 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 ...Gute Nacht für Heute, hier hats gerade etwas geregnet und man schlafen .......
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
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
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
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 viking!
Die Zeilen 2 und 3 sollen der leichteren Anpassbarkeit dienen - Du kannst dort auch vollständige Pfade der Art
angeben (ich hatte nur, da es sich mittlerweile ja um andere Daten handeln sollte, auch die Textdatei anders als jene des "Einstiegsbeispiels" benannt) ...
Grüße
bastla
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"
Ich gehe davon aus drei Spalten mit "@" als Trenner.
So hatte ich Deine Beschreibung gelesen ...Grüße
bastla
Hallo zusammen!
Also Viking, falls es dich noch interessiert, versuchs mal damit:
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
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
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
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
Moin viking,
aus gegebenem Anlass - nach schnutzibaers Angebot - stehen jetzt die (auch von mir etwas wortreicher formulierten) Alternativen für dich zur freien Auswahl.
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.
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.
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
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
Hallo @all!
als "Lang.txt" (andere Testdaten hatte ich nicht) liefert mit
unter 7_64Bit
als "Kurz.txt" ...
Grüße
bastla
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
@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
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
Grüße
bastla
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 "
Zur Sicherheit könntest Du auch noch in den Zeilen 2 und 3 vollständige Pfade angeben - also etwa:
[Edit] Die Informationen aus dem Folgethread lassen vermuten, dass der Batch an der "Nicht-Auffindbarkeit" der "
Grüße
bastla
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
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!> 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.
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
Hallo mathe172!
- 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 "&"):
Grüße
bastla
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 (
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
bastla
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.
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
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
Und es funktioniert eben auch, falls in Tracks oder Albumnamen auch "!" enthalten sind.
Grüße
Biber
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...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
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
....
Grüße
Biber
@Biber: Danke für's Einspringen (ich vermeide sowas ja nach Möglichkeit )
Grüße
bastla
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