1.9k Aufrufe
Gefragt in Windows 7 von
Hallo! Ich möchte aus einer CSV-Datei aus der ersten Zeile die Spalte 42 auslesen und den ausgelesenen String dem Dateinamen am Anfang zufügen. Dieses soll mittels einer Batch-Datei erfolgen.

Vielen Dank im Voraus.

4 Antworten

0 Punkte
Beantwortet von
und was hindert dich daran? hast du schon selber einen versuch unternommen? welche kenntnisse der batchprogrammierung kannst du vorweisen? welche erfahrungen?

oder waren deine angaben eher als arbeitsanweisung zu verstehen...
0 Punkte
Beantwortet von
Ich habe keine Erfahrungen mit der Batch- Programmierung und habe bisher nur ein wenig in VBA programmiert.
Ich habe schon ein Problem beim Auslesen. Bei 31 macht die u.a. Sequenz Schluss.
for /f "tokens=31 delims=, " %%a in (Test.csv) do echo %%a>>ausgelesen.csv

Kann vielleicht jemand ein gutes Buch über Batch- Programmierung empfehlen?
0 Punkte
Beantwortet von
Hallo, mit einem Buch ist das nicht gemacht, denn eine Batch macht nur das was man per Hand eingeben würde, nur halt im Stapel (nacheinander).
Aber wie/was zu machen ist, muss schon geläufig sein.

Im Netz findest du genug, gebe mal in der Suchleiste "batch programmierung literatur" ein und schon wird dir einiges angeboten- sogar ohne kaufen zu müssen.

Was dein eigentliches Problem angeht, kann man nicht wirklich was dazu...
Den meisten hier ist CSV bekannt, aber auch, dass eine *.csv nicht gleich *.csv ist.
Das heißt, erstellt man eine *.csv, sei es Kontakte oder eine Tabelle mit einer Office Version und nachher bei einer anderen (höheren) es wieder zurückspielen will, gibt es Probleme- OK nicht immer.
Entweder wird die *.csv nicht verstanden oder falsch interpretiert.
Beispielsweise tauchen nachher irgendwelche Spalten die in der Ursprungsdatei gar nicht da sind.

Ich habe schon ein Problem beim Auslesen. Bei 31 macht die u.a. Sequenz Schluss.
for /f "tokens=31 delims=, " %%a in (Test.csv) do echo %%a>>ausgelesen.csv
Schon mehr darüber wäre angebracht.
Aber die Zahl 31 an sich interessant, aber was davor um so mehr.

Gruß

Über CSV findest du ebenfalls was im Netz, einfach nach "csv standard" suchen lassen.
0 Punkte
Beantwortet von massaraksch Experte (3.1k Punkte)
Hallo,

von Batch-Scripting mit der CMD.EXE halte ich ehrlich gesagt nichts mehr. Da du Win 7 hast, hast du die Powershell. Bietet wesentlich mehr Möglichkeiten (und meist auch einfacher, weil auch besser "lesbar").

Beispiel zu deiner Anforderung (Langform):
Get-ChildItem "X:\Verzeichnis\Test.csv" | ForEach-Object { Rename-Item $_ ((Get-Content $_ -TotalCount 1).Split(",")[41] + "-" + $_.Name) -WhatIf }

Schreibweise mit Abkürzungen (bin normalerweise schreibfaul ;o)
gci "X:\Verzeichnis\Test.csv" | % { rni $_ ((gc $_ -TotalCount 1).Split(",")[41] + "-" + $_.Name) -WhatIf }

Kurze Erklärung:

Get-ChildItem "X:\Verzeichnis\Test.csv" holt sich das Dateiobjekt.

Mit der Pipe | wird es an den nächsten Befehl übergeben.

ForEach-Object { ... } führt die gewünschten Aktionen (zwischen den Klammern) für das/die übergebene(n) Objekt(e) aus.

Rename-Item... klar.
"$_" ist dabei das übergebene Objekt (die Datei).

Get-Content $_ -TotalCount 1
Liest die erste Zeile der Datei aus.

.Split(",")[41]
Erzeugt ein Array mit den einzelnen Teilstrings der Zeile (das Komma wird dabei als Trennzeichen angesehen) und gibt mit der Angabe [41] den 42. Teilstring aus (da die Zählung bei 0 beginnt!).

$_.Name ist der Originalname der Datei und mittels
...+ "-" +... wird der neue Name (hier mit Bindestrich dazwischen) zusammengesetzt.

Hier also "InhaltderSpalte42-Originalname". Das + "-" (Bindestrich) kann man natürlich weglassen oder irgendwas anderes nehmen.

Wichtig!
Mit dem Parameter -WhatIf ("was ist, wenn") wird der Befehl nur getestet und nicht wirklich ausgeführt. Sehr gut zum Probieren, um erstmal gefahrlos zu schauen, was passieren würde.

Um den Befehl dann wirklich auszuführen, einfach das "-WhatIf" entfernen (aber nicht die letzte Klammer!).

PS:
Will man das Ganze gleich mit allen CSV-Dateien im Verzeichnis machen, dann z.B. so:
gci "X:\Verzeichnis\*.csv" | % { rni $_ ((gc $_ -TotalCount 1).Split(",")[41] + "-" + $_.Name) -WhatIf }

Hoffe, es sind keine Fehler drin. Habs aber eigentlich getestet.

mfg, Massaraksch
...