arminvandyk
Goto Top

Inhalte aus einer Datei auslesen und anders angeordnet in neuer Datei ausgeben lassen

Hallo,

ich habe folgendes Problem. In meinem Unternehmen haben wir jetzt eine neue Kasse im Einsatz, welche die Mitarbeiterzeiten etwas anders ausgibt, als die anderen Kassen bei uns.
Die neue Ausgabe-Datei kann die Schnittstelle unseres Arbeitszeitsystem nicht einlesen. Daher benötige ich eine Batch –Datei, welche die Daten aus der time.dat ausliest und richtig sortiert wieder in einer time.sal ausgibt. Die Batch will ich dann jeden Morgen per Timer laufen lassen, bevor unser Arbeitszeitsystem die Zeiten aus der Datei einliest.

Die Ausgabedateien ähneln sich sehr, aber ich habe absolut keinen Plan wie ich das hinbekommen soll.

Ich habe eine time.dat mit folgendem Inhalt:

Nicht verwendet/Filialnummer/Kassennummer/Datum d. Berichts/Uhrzeit d. Berichts/Mitarbeiternummer/Anfang/Ende/Gesamt/Name

0 0 431 17032015 2359 1234 0422 1320 085745 Name MA1
0 0 431 17032015 2359 5678 0552 1408 081610 Name MA2

Nötige Änderungen:
• das Feldtrennzeichen von Tab auf Semikolon ändern
• der dritte Eintrag soll an der Stelle des zweiten Eintrages stehen
• die Mitarbeiterbezeichnung in Anführungszeichen gesetzt
• eine Tätigkeit (immer 0) am Ende hinzugefügt werden soll

0;431;0;17032015;2359;1234;0422;1320;085745;“Name MA1“;0
0;431;0;17032015;2359;5678;0552;1408;081610;“Name MA2“;0

Könnt ihr mir da helfen?

Content-Key: 267413

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

Printed on: April 20, 2024 at 08:04 o'clock

Mitglied: 114757
114757 Mar 25, 2015, updated at Mar 26, 2015 at 09:59:04 (UTC)
Goto Top
Moin,
sieht die Überschriftenzeile genau so aus (mit den Schrägstrichen), oder sind die auch mit Tab voneinander getrennt ? oder überhaupt nicht in der Datei vorhanden ?

Bitte nutze doch Codetags für deinen Quellcode: <code> Quellcode </code>. Danke.

Ich würde das mit Powershell machen, damit ist das ein Klacks.
Für den Fall das die Datei keine Überschriften hat ginge das dann so:
$in = "C:\temp\time.dat"  
$out = "C:\temp\time_out.csv"  
$csv = import-csv $in -Delimiter "`t" -Header 1,2,3,4,5,6,7,8,9,10,11  
$csv | %{$_.'11' = 0}  
$csv | select '1','3','2','4','5','6','7','8','9','10','11' | ConvertTo-CSV -Delimiter ";" -NoType | select -skip 1 | set-content $out -Force  

Mit Batch könnte das etwa so aussehen:
@echo off & setlocal
set "IN=C:\temp\time.csv"  
set "OUT=C:\temp\time_out.csv"  
del /q "%OUT%" 2>nul  
for /f "usebackq tokens=1-10 delims=	" %%a in ("%IN%") DO @(  
    echo %%a;%%c;%%b;%%d;%%e;%%f;%%g;%%h;%%i;"%%j";0 >>"%OUT%"  
)
Gruß jodel32
Member: ArminVanDyk
ArminVanDyk Mar 26, 2015 at 09:03:37 (UTC)
Goto Top
Die Überschriften habe ich nur zum besseren Verständnis hingeschrieben, sie stehen nicht mit in der Datei. Super, damit hast Du mir sehr, sehr weitergeholfen. Vielen vielen Dank. Ich probiere es gleich mal aus.
Member: ArminVanDyk
ArminVanDyk Mar 26, 2015 at 09:56:26 (UTC)
Goto Top
Hallo jodel32,

der powershell-Ansatz funktioniert soweit, wenn ich Punkt 4 auslasse. Da spuckt es folgendes aus:

"0";"431";"0";"17032015";"2359";"1234";"0422";"1320";"085745";"Name MA1";""
"0";"431";"0";"17032015";"2359";"5678";"0552";"1408";"081610";"Name MA2";""

Lasse ich Punkt 4 drin, dann kommt folgender Fehler:

Unerwartetes Token ".11" im Ausdruck oder in der Anweisung.
Bei C:\Users\...\Desktop\Unbenannt1.ps1:8 Zeichen:16

back-to-top$csv | % {$_.11 <<<< = 0}

+ CategoryInfo : ParserError: (.11:String) , ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken

Wie bekomme ich noch die Gänsefüßchen bei der Ausgabedatei weg?
Mitglied: 114757
114757 Mar 26, 2015 updated at 10:00:46 (UTC)
Goto Top
Lasse ich Punkt 4 drin, dann kommt folgender Fehler:
korrigiert. Funktioniert mit PS 3.0 einwandfrei.
Wie bekomme ich noch die Gänsefüßchen bei der Ausgabedatei weg?
($csv | select '1','3','2','4','5','6','7','8','9','10','11' | ConvertTo-CSV -Delimiter ";" -NoType | select -skip 1 | ) -replace '"','' | set-content $out -Force  
Member: ArminVanDyk
ArminVanDyk Mar 26, 2015 updated at 10:16:15 (UTC)
Goto Top
Genial jetzt geht es. Ich habe jetzt leider nur noch etwas festgestellt. Der Name, also Eintrag 10 muss in Gänsefüßchen bleiben. Einfach hinter dem -replace noch ein -replace?
Mitglied: 114757
114757 Mar 26, 2015 updated at 10:18:03 (UTC)
Goto Top
(($csv | select '1','3','2','4','5','6','7','8','9','10','11' | ConvertTo-CSV -Delimiter ";" -NoType | select -skip 1 ) -replace '"','') -replace '([^;]*)(;0)$','"$1"$2' | Set-Content $out -Force  
Member: ArminVanDyk
ArminVanDyk Mar 26, 2015 at 10:22:04 (UTC)
Goto Top
Danke jodel32, jetzt ist es so, wie ich es benötige. Ich kann mich gar nicht genug bei Dir bedanken.
Mitglied: 114757
114757 Mar 26, 2015 updated at 10:27:21 (UTC)
Goto Top
Kein Thema face-smile
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen.

Gruß jodel32