xerebus
Goto Top

Batch Sortierung und Ausgabe

Hallo Kollegen,

ich habe hier ein kleines Verständnissproblem mit einer Batch Datei.

Ich will eine csv Datei mit ; Trennung aufsplitten.
In Zeile 2 beginnen die Daten die ich brauche.
AB Spalte 1 bis Spalte 25 stehen die Daten zum ausgeben.


Sortierung Daten1 Daten2
12354323 assad gdfg
12354323 dgfsgfsd gdfg
12354323 sdf gdsgs
32452342 dsgf dsgds
32452342 sdf dsgds
1254353 dsf gfhfd
1254353 sdfds ztrurt

Ich will es schaffen das neue CSV Dateien mit allen gleichen Inhalten von "Sortierung" in eine Datei mit den Namen der ersten Spalte geschrieben wird bis zum Ende der Zeilen.
Also 12354323.csv mit Inhalt:
12354323 assad gdfg
12354323 dgfsgfsd gdfg
12354323 sdf gdsgs

Wie ich die Schleife mache ist mir klar nur wie frage ich auf gleichen Inhalt in der Schleife ab und Speichere diese dann in den Dateien.

Wäre Super wenn mir hier jemand auf die Sprünge helfen könnte.

Content-ID: 366074

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

Ausgedruckt am: 23.11.2024 um 09:11 Uhr

Arano
Arano 26.02.2018 aktualisiert um 13:58:18 Uhr
Goto Top
Hi,

mit deiner Schleife durchläuft du doch jeden Datensatz oder ?
Dann brauchst du nur prüfen ob eine Datei mit dem Namen aus der ersten Spalte existiert. Wenn, dann Daten anhängen ">>", wenn nicht erstellen und Einfügen ">"
Etwa so: (kenne mich in Batch nicht gut aus)
for %%a in datei.csv do (
    for token=" " %%b in %a do (  
        if existsts "%b.csv" (  
            :: anfügen
            echo "%b %c %d..." >>"%a.csv"  
        ) else (
            :: neu
            echo "%b %c %d..." >>"%a.csv"  
        )
    )
)


~Arano
rubberman
Lösung rubberman 26.02.2018 um 17:47:17 Uhr
Goto Top
Japp, so ähnlich.

for /f "usebackq skip=1 tokens=1* delims=;" %%i in ("file.csv") do >>"%%~i.csv" echo %%i;%%j  
Steffen
Xerebus
Xerebus 27.02.2018 um 08:48:11 Uhr
Goto Top
@rubberman
Super das klappt in einer Testdatei.

Leider habe ich bei der Datei die ich aufteilen will Sonderzeichen "!"§$%&/()= " mit drinnen und irgendwie verhaut es mir die Ausgabe.
Kann ich die einzelnen Zellen in der Batch maskieren?

Das hier reicht leider noch nicht.
for /f "usebackq skip=1 tokens=1* delims=;" %%i in ("datei.csv") do echo "%%i";"%%j">>"%%~i.csv"
rubberman
rubberman 27.02.2018 um 11:38:28 Uhr
Goto Top
Batch ist da immer eine unschöne Sache.
Versuch
@echo off &setlocal DisableDelayedExpansion
for /f "usebackq skip=1 tokens=1* delims=;" %%i in ("datei.csv") do (  
  set "name=%%~i"  
  set "first=%%i"  
  set "rest=%%j"  
  setlocal EnableDelayedExpansion
  >>"!name!.csv" echo !first!;!rest!  
  endlocal
)
Steffen
Xerebus
Xerebus 27.02.2018 aktualisiert um 13:44:42 Uhr
Goto Top
AHHH
Ich hab gefunden wo der Fehler liegt.
Ich war auch schon auf dem richtigen weg. Script funktioniert soweit wunderbar...

Wie geschrieben funktioniert das mit einer Testtabelle -- Exportieren in CSV und dann mit dem Script super.

Leider funktioniert das Umwandeln von einer *.xlsx in CSV nicht wie gewünscht.
Excel zeigt die CSV richtig an nur wenn ich die in Notepad öffne sehe ich das alles verschoben ist.
Alles möglich schon versucht. Bekomme die * Excel Tabelle nicht in ein Format zum weiter zu bearbeiten.

//Edit
Eine Spalte hat Inhalte mit Zeilenumbrüchen...
rubberman
rubberman 27.02.2018 um 18:35:58 Uhr
Goto Top
Zitat von @Xerebus:
//Edit
Eine Spalte hat Inhalte mit Zeilenumbrüchen...
Zeilenumbrüche im Wert sind (im Fall von aus Excel exportierten Daten) einzeln stehende Line Feed Zeichen. Das ist exakt das Zeichen, das auch in der Verarbeitung per Batch als Zeilenumbruch ausgewertet wird. Das bei Windows normalerweise noch voranstehende Carriage Return Zeichen am Ende der Zeile wird verworfen, sodass auch der reguläre Zeilenumbruch nur noch als Line Feed stehen bleibt. Soll heißen, hier ist mit Batch keine Lösung in Sicht weil der Kommandozeileninterpreter keinen Unterschied erkennt. Andere Scriptsprachen können so etwas händeln. Mal sehen ob sich noch jemand aus der Powershellfraktion in dieses Thread verirrt. Zur Not könnte ich mit VBScript oder JScript aushelfen...

Steffen
Xerebus
Xerebus 01.03.2018 um 10:08:24 Uhr
Goto Top
@rubberman
habe ich leider auch festgestellt.
Und mit Batch sehe ich keine Möglichkeit die LF zu löschen und die CR LF unberührt zu lassen.
rubberman
Lösung rubberman 01.03.2018 um 19:07:22 Uhr
Goto Top
Zitat von @Xerebus:
Und mit Batch sehe ich keine Möglichkeit die LF zu löschen und die CR LF unberührt zu lassen.
Das ist richtig. Wenn du sie allerdings nicht benötigst, dann löschst du sie eben anderweitig.
*.bat
@if (@a)==(@b) @end /*
@echo off & setlocal

cscript //nologo //e:jscript "%~fs0" "datei.csv" 
:: etc.

goto :eof */
var oFSO = WScript.CreateObject('Scripting.FileSystemObject');  
var s = oFSO.OpenTextFile(WScript.Arguments(0)).ReadAll();
oFSO.OpenTextFile(WScript.Arguments(0), 2).Write(s.replace(/\r\n/g, '\r\r').replace(/\n/g, ' ').replace(/\r\r/g, '\r\n'));  
Xerebus
Xerebus 04.03.2018 um 11:33:13 Uhr
Goto Top
@rubberman.

Super danke dir.
Jetzt klappt die Umwandlung so wie ich es will.