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-Key: 366074

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

Printed on: April 19, 2024 at 09:04 o'clock

Member: Arano
Arano Feb 26, 2018 updated at 12:58:18 (UTC)
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
Member: rubberman
Solution rubberman Feb 26, 2018 at 16:47:17 (UTC)
Goto Top
Japp, so ähnlich.

for /f "usebackq skip=1 tokens=1* delims=;" %%i in ("file.csv") do >>"%%~i.csv" echo %%i;%%j  
Steffen
Member: Xerebus
Xerebus Feb 27, 2018 at 07:48:11 (UTC)
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"
Member: rubberman
rubberman Feb 27, 2018 at 10:38:28 (UTC)
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
Member: Xerebus
Xerebus Feb 27, 2018 updated at 12:44:42 (UTC)
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...
Member: rubberman
rubberman Feb 27, 2018 at 17:35:58 (UTC)
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
Member: Xerebus
Xerebus Mar 01, 2018 at 09:08:24 (UTC)
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.
Member: rubberman
Solution rubberman Mar 01, 2018 at 18:07:22 (UTC)
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'));  
Member: Xerebus
Xerebus Mar 04, 2018 at 10:33:13 (UTC)
Goto Top
@rubberman.

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