Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
Kommentar vom Moderator Dani am 07.08.2014 um 13:06:47 Uhr
Verschoben.
GELÖST

Sehr kniffliges Problem - Powershell regular expression :-(

Frage Entwicklung Batch & Shell

Mitglied: internet2107

internet2107 (Level 1) - Jetzt verbinden

07.08.2014, aktualisiert 08.08.2014, 1675 Aufrufe, 7 Kommentare, 3 Danke

Aus einem Messgerät fließen eine bestimmte Anzahl von Daten durch Messungen. Wegen der ggf. Masse an Dateien, importieren wir aktuell die Dateien per Hand in Excel und ändern dann auch alles per Hand in Excel.
Um das zu automatisieren und viel schneller handeln zu können, würde ich gerne mit Powershell dieses umsetzen.

Ich habe also eine Textdatei, die von einem Instrument ausgegeben wird, um sie dann nach Wunsch in Excel zu öffnen (einzulesen).

Diese Datei sieht nach der Ausgabe durch das Instrument z.B. so aus:

01.
,,,,,,,,,,,,,,,,,,,,  21,,  22,,  40,,  57,,  59,,  80,, 102,, 158,, 210,, 220,, 311,, 312,, 313,, 413,, 418,, 435,, 452,, 510,, 570,, 588,, 661,, 678,, 684,, 686,, 690,, 691,, 698,, 701,, 708,, 712,, 714,, 731,, 734,, 750,, 767,, 781,, 798,, 989,, 990,, 991,, 992,, 993,, 994, 
02.
,,,,,,,,,,,,,,,,,,,,C,,C,,C,,C,,C,,C,,,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C,,C, 
03.
,,,,,,,,,,,,,,,,,,,,1,,1,,1,,1,,1,,1,,,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1,,1, 
04.
R_Type1,R_Type2,S_Type,S_No.,R_No.,Pos,S_ID,M_Date,Age,Unit,Sex,S_Date,C1,C2,C3,C4,C5,Cup,Ope_D,N,U/L   ,,U/L   ,,mmol/L,,U/L   ,,mmol/L,,U/L   ,,ug/mL ,,U/L   ,,mg/L  ,,U/L   ,,U/L   ,,U/L   ,,U/L   ,,g/L   ,,mmol/L,,mmol/L,,umol/L,,kU/L  ,,U/L   ,,U/L   ,,umol/L,,g/L   ,,U/L   ,,U/L   ,,umol/L,,mmol/L,,mmol/L,,mmol/L,,mg/L  ,,umol/L,,mmol/L,,U/L   ,,umol/L,,mAbs  ,,mmol/L,,mmol/L,,mmol/L,,mmol/L,,mmol/L,,mmol/L,,,,,,, 
05.
1,1,1,    1, 1334,1,1            ,2014/07/30 13:41:00,,,,,                              ,                         ,                    ,               ,          ,1,,  8,,,,,,,,,,,,,,,    94,,,,    55,,,,,,,,,,,,,,,,,,,,  27.7,,,,,,    47,,    49,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,     8,,     6,,     2, 
06.
1,2,1,    1, 1334,1,1            ,2014/07/30 13:41:00,,,,,                              ,                         ,                    ,               ,          ,1,,  1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,  29.1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 
07.
1,1,1,    2, 1334,2,             ,2014/07/30 13:41:00,,,,,                              ,                         ,                    ,               ,          ,1,,  8,,,,,,,,,,,,,,,    95,,,,    55,,,,,,,,,,,,,,,,,,,,  28.1,,,,,,    46,,    48,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,     9,,     6,,     2, 
08.
1,1,1,    3, 1334,3,             ,2014/07/30 13:41:00,,,,,                              ,                         ,                    ,               ,          ,1,,  8,,,,,,,,,,,,,,,    95,,,,    55,,,,,,,,,,,,,,,,,,,,  27.8,,,,,,    47,,    47,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,     9,,     6,,     2, 
09.
1,1,1,    4, 1334,4,             ,2014/07/30 13:41:00,,,,,                              ,                         ,                    ,               ,          ,1,,  8,,,,,,,,,,,,,,,    94,,,,    55,,,,,,,,,,,,,,,,,,,,  27.8,,,,,,    47,,    48,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,     9,,     5,,     2, 
10.
1,1,1,    5, 1334,5,             ,2014/07/30 13:41:00,,,,,                              ,                         ,                    ,               ,          ,1,,  8,,,,,,,,,,,,,,,    95,,,,    56,,,,,,,,,,,,,,,,,,,,  27.9,,,,,,    46,,    48,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,     9,,     7,,     2, 
11.
1,1,1,    6, 1335,1,6            ,2014/07/30 11:09:00,,,,,                              ,                         ,                    ,               ,          ,1,, 15,,,,,,,,,,,,,,,,,,,,,,,,,,,  32.6,,  6.43,,,,,,,,    84,,,,,,  47.8,,,,,,    96,,,,  2.18,,,,,,  17.2,,  1.15,, 53.20,,,,,,  5.66,,  1.17,,  2.11,,   110,,  3.62,,  76.1,,,,,,, 
12.
1,1,1,    7, 1335,2,             ,2014/07/30 11:09:00,,,,,                              ,                         ,                    ,               ,          ,1,, 15,,,,,,,,,,,,,,,,,,,,,,,,,,,  32.5,,  6.52,,,,,,,,    86,,,,,,  48.4,,,,,,    97,,,,  2.15,,,,,,  16.9,,  1.13,, 53.83,,,,,,  5.71,,  1.18,,  2.12,,   112,,  3.67,,  77.7,,,,,,, 
13.
1,1,1,    8, 1335,3,             ,2014/07/30 11:09:00,,,,,                              ,                         ,                    ,               ,          ,1,, 15,,,,,,,,,,,,,,,,,,,,,,,,,,,  31.6,,  6.47,,,,,,,,    84,,,,,,  48.0,,,,,,    97,,,,  2.22,,,,,,  17.0,,  1.16,, 52.56,,,,,,  5.68,,  1.17,,  2.10,,   111,,  3.67,,  77.8,,,,,,, 
14.
1,1,1,    9, 1335,4,             ,2014/07/30 11:09:00,,,,,                              ,                         ,                    ,               ,          ,1,, 15,,,,,,,,,,,,,,,,,,,,,,,,,,,  32.1,,  6.38,,,,,,,,    85,,,,,,  47.2,,,,,,    96,,,,  2.15,,,,,,  16.7,,  1.15,, 53.21,,,,,,  5.60,,  1.18,,  2.10,,   112,,  3.69,,  77.9,,,,,,, 
15.
1,1,1,   10, 1335,5,             ,2014/07/30 11:09:00,,,,,                              ,                         ,                    ,               ,          ,1,, 15,,,,,,,,,,,,,,,,,,,,,,,,,,,  32.1,,  6.47,,,,,,,,    84,,,,,,  49.1,,,,,,    99,,,,  2.19,,,,,,  16.8,,  1.17,, 53.60,,,,,,  5.61,,  1.17,,  2.11,,   112,,  3.70,,  77.9,,,,,,, 
16.
17.
 

Mein Problem ist nun aber folgendes.
Aus dieser Datei müssen vor dem Export nach Excel folgende Dinge verändert werden:
1) soll die 2. und 3. Zeile gelöscht werden
2) müssten die Zeichen wie R_Type1,R_Type2, ... und andere ebenso entfernt werden. Das Problem hierbei ist nun aber, dass auch die dann sich darunter befindlichen Werte mit gelöscht werden müssen, da sonst beim Öffnen in Excel die Spalten nicht mehr stimmen.
Also als Beispiel sollte nach dem Import aus der ersten Zeile z.B. die Zahl 158 mit dem Wert "u/L" aus der wegen Punkt 1) gelöschten Zeilen, dann Zeile 2 übereinanderstimmen, ebenso dann die entsprechenden Werte darunter, in dem Fall 94,95,95,95,94,95
3) dazu kommt, dass man sehen kann: es bestehen dort doppelte Kommas, die beim Import in Excel leere Spalten verursachen. Diese sollten ebenso vermieden werden.

Ich habe mal eine Datei soweit editiert, wie sie am Ende aussehen soll, damit man sie einfach in Excel importieren kann.

01.
;;;;  21;  22;  40;  57;  59;  80; 102; 158; 210; 220; 311; 312; 313; 413; 418; 435; 452; 510; 570; 588; 661; 678; 684; 686; 690; 691; 698; 701; 708; 712; 714; 731; 734; 750; 767; 781; 798; 989; 990; 991; 992; 993; 994; 
02.
S_Type;S_No.;S_ID;M_Date;"U/L";"U/L";"mmol";"U/L";"mmol";"U/L";"ug/mL";"U/L";"mg/L";"U/L";"U/L";"U/L";"U/L";"g/L";"mmol/L";"mmol/L";"umol/L";"kU/L";"U/L";"U/L";"umol/L";"g/L";"U/L";"U/L";"umol/L";"mmol/L";"mmol/L";"mmol/L";"mg/L";"umol/L";"mmol/L";"U/L";"umol/L";"mAbs";"mmol/L";"mmol/L";"mmol/L";"mmol/L";"mmol/L";"mmol/L";;; 
03.
1;1;1;30/07/2014;;;;;;;;94;;55;;;;;;;;;;  27.7;;;47;49;;;;;;;;;;;;;;;;;8;6;2 
04.
1;1;1;30/07/2014;;;;;;;;;;;;;;;;;;;;  29.1;;;;;;;;;;;;;;;;;;;;;;; 
05.
1;2;             ;30/07/2014;;;;;;;;95;;55;;;;;;;;;;  28.1;;;46;48;;;;;;;;;;;;;;;;;9;6;2 
06.
1;3;             ;30/07/2014;;;;;;;;95;;55;;;;;;;;;;  27.8;;;47;47;;;;;;;;;;;;;;;;;9;6;2 
07.
1;4;             ;30/07/2014;;;;;;;;94;;55;;;;;;;;;;  27.8;;;47;48;;;;;;;;;;;;;;;;;9;5;2 
08.
1;5;             ;30/07/2014;;;;;;;;95;;56;;;;;;;;;;  27.9;;;46;48;;;;;;;;;;;;;;;;;9;7;2 
09.
1;6;6;30/07/2014;;;;;;;;;;;;;;  32.6;  6.43;;;;84;;;  47.8;;;96;;  2.18;;;  17.2;  1.15; 53.20;;;  5.66;  1.17;  2.11;110;  3.62;  76.1;;; 
10.
1;7;             ;30/07/2014;;;;;;;;;;;;;;  32.5;  6.52;;;;86;;;  48.4;;;97;;  2.15;;;  16.9;  1.13; 53.83;;;  5.71;  1.18;  2.12;112;  3.67;  77.7;;; 
11.
1;8;             ;30/07/2014;;;;;;;;;;;;;;  31.6;  6.47;;;;84;;;  48.0;;;97;;  2.22;;;  17.0;  1.16; 52.56;;;  5.68;  1.17;  2.10;111;  3.67;  77.8;;; 
12.
1;9;             ;30/07/2014;;;;;;;;;;;;;;  32.1;  6.38;;;;85;;;  47.2;;;96;;  2.15;;;  16.7;  1.15; 53.21;;;  5.60;  1.18;  2.10;112;  3.69;  77.9;;; 
13.
1;10;             ;30/07/2014;;;;;;;;;;;;;;  32.1;  6.47;;;;84;;;  49.1;;;99;;  2.19;;;  16.8;  1.17; 53.60;;;  5.61;  1.17;  2.11;112;  3.70;  77.9;;; 
14.
 
Ich habe zwar verschiedene Ansätze (get-content...) usw., aber leider bin ich in Powershell nicht so professionell drauf, um dieses zu einem Wunschergebis umsetzen zu können.
Kann mir hier jemand helfen ?.
Mitglied: aqui
07.08.2014 um 12:49 Uhr
Ist wohl eher was für die Abteilung "Batch & Shell" hier, oder ?
Bitte warten ..
Mitglied: Friemler
LÖSUNG 07.08.2014, aktualisiert 20.08.2014
Hallo,

statt diese Aufgabe mit Regular Expressions zu lösen, sollte das doch besser mit dem Programm erledigt werden, das dafür am besten geeignet ist - Excel selbst. Da sich Excel per ActiveX-Schnittstelle "fernsteuern" lässt, ist das auch kein Problem.

Deshalb hier mein Vorschlag in VBScript, das ich immer noch gegenüber PowerShell bevorzuge:

01.
Option Explicit 
02.
 
03.
 
04.
'----------------------------------- 
05.
' Konstanten für Datei Ein-/Ausgabe 
06.
'----------------------------------- 
07.
 
08.
Const ForReading   = 1 
09.
Const ForWriting   = 2 
10.
Const ForAppending = 8 
11.
 
12.
 
13.
 
14.
'----------------------------------- 
15.
' Globale Variablen deklarieren 
16.
'----------------------------------- 
17.
 
18.
Dim strScriptPath, strScriptName 
19.
Dim strInFile, strOutFile, strConfigFile 
20.
Dim dicColHeaders, dicCodeNumbers 
21.
Dim arrColumnsToDelete 
22.
Dim colArgs, objFSO, objExcel 
23.
 
24.
 
25.
 
26.
'----------------------------------- 
27.
' Konfiguration 
28.
'----------------------------------- 
29.
 
30.
'Standardname der Datei, die Informationen zum Ändern von Zellinhalten enthält 
31.
strConfigFile = "config.ini" 
32.
 
33.
 
34.
 
35.
'----------------------------------- 
36.
' Hauptprogramm 
37.
'----------------------------------- 
38.
 
39.
'Liste der Programmparameter holen 
40.
Set colArgs = WScript.Arguments 
41.
 
42.
'Objekt für den Zugriff auf Dateisystem-Funktionen erzeugen 
43.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
44.
 
45.
'Vollständigen Pfad ermitteln, unter dem dieses Script gestartet wurde 
46.
'und den Namen der Scriptdatei daraus extrahieren 
47.
strScriptPath = WScript.ScriptFullName 
48.
strScriptName = objFSO.GetBaseName(strScriptPath) 
49.
 
50.
 
51.
'Prüfen, ob alle benötigten Parameter übergeben wurden 
52.
'und ggf. Standardwerte setzen 
53.
If ParseCommandLine Then 
54.
  'Leeres Array anlegen, in dem die Titel 
55.
  'der zu löschenden Spalten gespeichert werden 
56.
  arrColumnsToDelete = Array() 
57.
 
58.
  'Dictionary-Objekte für die Speicherung der Konfiguration erzeugen 
59.
  Set dicCodeNumbers = CreateObject("Scripting.Dictionary") 
60.
  Set dicColHeaders  = CreateObject("Scripting.Dictionary") 
61.
 
62.
  'Die Konfigurationsdatei laden 
63.
  If LoadConfigFile(strConfigFile) Then 
64.
    'Wenn kein Fehler aufgetreten ist, die CSV-Datei laden 
65.
    If OpenCSVFile(strInFile) Then 
66.
      'Wenn kein Fehler aufgetreten ist, die gewünschten Änderungen ausführen, ... 
67.
      Call ProcessCSVFileContent 
68.
 
69.
      '...die Datei speichern, ... 
70.
      Call SaveCSVFile(strOutFile) 
71.
 
72.
      '...und Excel beenden 
73.
      objExcel.Quit 
74.
    Else 
75.
      'Falls das Laden der CSV-Datei fehlschlug, eine Fehlermeldung anzeigen 
76.
      Call ShowFileLoadError(strInFile) 
77.
    End If 
78.
  Else 
79.
    'Falls das Laden der Konfigurationsdatei fehlschlug, eine Fehlermeldung anzeigen 
80.
    Call ShowFileLoadError(strConfigFile) 
81.
  End If 
82.
Else 
83.
  'Falls kein Pfad zu einer Eingabedatei angegeben wurde, eine Fehlermeldung anzeigen 
84.
  Call ShowParamsError 
85.
End If 
86.
 
87.
 
88.
 
89.
 
90.
'----------------------------------- 
91.
' Unterprogramme 
92.
'----------------------------------- 
93.
 
94.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
95.
'/ Gewünschte Änderungen an der CSV-Datei ausführen 
96.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
97.
Sub ProcessCSVFileContent 
98.
  On Error Resume Next 
99.
 
100.
  Dim objActiveSheet, objColumn, objCell 
101.
  Dim strColumnHeader, strCol1Sample, strCodeNum, arrDateParts 
102.
 
103.
  'Aktives Arbeitsblatt holen 
104.
  Set objActiveSheet = objExcel.ActiveSheet 
105.
 
106.
  'Zeile 2 und 3 löschen 
107.
  objActiveSheet.Rows(3).Delete 
108.
  objActiveSheet.Rows(2).Delete 
109.
 
110.
  'Alle Elemente der Löschliste verarbeiten 
111.
  For Each strColumnHeader In arrColumnsToDelete 
112.
    'Alle verwendeten Spalten des Arbeitsblatts verarbeiten 
113.
    For Each objColumn In objActiveSheet.UsedRange.Columns 
114.
      'Wenn in Zeile 2 der Spalte einer der Spaltentitel aus der 
115.
      'Löschliste enthalten ist, die komplette Spalte löschen 
116.
      If objColumn.Cells(2, 1) = strColumnHeader Then 
117.
        objColumn.Delete 
118.
      End If 
119.
    Next 
120.
  Next 
121.
 
122.
  'Stichprobe aus Spalte 1, Zeile 3 entnehmen 
123.
  strCol1Sample = objActiveSheet.UsedRange.Cells(3, 1) 
124.
   
125.
  'Alle Spalten in Zeile 1 verarbeiten 
126.
  For Each objCell In objActiveSheet.UsedRange.Rows(1).Columns 
127.
    'Codenummer aus der aktuellen Zelle lesen 
128.
    strCodeNum = Trim(objCell.Value) 
129.
 
130.
    'Codenummern durch Abkürzungen für Inhaltsstoffe ersetzen 
131.
    'Wenn Spalte 1, Zeile 3 den Wert 2 enthält, wird die Codenummer 
132.
    'durch den Wert ersetzt, der in der Konfigurationsdatei beim 
133.
    'Schlüssel <Codenummer>u angegeben ist, ansonsten wird der Wert 
134.
    'beim Schlüssel <Codenummer> verwendet 
135.
    If strCol1Sample = "2" And dicCodeNumbers.Exists(strCodeNum & "u") Then 
136.
      objCell.Value = dicCodeNumbers.Item(strCodeNum & "u") 
137.
    ElseIf dicCodeNumbers.Exists(strCodeNum) Then 
138.
      objCell.Value = dicCodeNumbers.Item(strCodeNum) 
139.
    End If 
140.
  Next 
141.
 
142.
  'Alle Spalten in Zeile 2 verarbeiten 
143.
  For Each objCell In objActiveSheet.UsedRange.Rows(2).Columns 
144.
    'Spaltentitel ersetzen 
145.
    If dicColHeaders.Exists(Trim(objCell.Value)) Then 
146.
      objCell.Value = dicColHeaders.Item(Trim(objCell.Value)) 
147.
    End If 
148.
  Next 
149.
 
150.
  'Alle Zeilen in Spalte 1 verarbeiten 
151.
  For Each objCell In objActiveSheet.UsedRange.Columns(1).Rows 
152.
    'Wenn die Zeilennummer größer als 2 ist... 
153.
    If objCell.Row > 2 Then 
154.
      '...Kennungen durch Texte ersetzen 
155.
      If     objCell.Value = "1" Then objCell.Value = "flüssig" 
156.
      ElseIf objCell.Value = "2" Then objCell.Value = "fest" 
157.
    End If 
158.
  Next 
159.
 
160.
  'Alle Zeilen in Spalte 4 verarbeiten 
161.
  For Each objCell In objActiveSheet.UsedRange.Columns(4).Rows 
162.
    'Wenn die Zeilennummer größer als 2 ist... 
163.
    If objCell.Row > 2 Then 
164.
      '...nur die Datumsangabe extrahieren... 
165.
      arrDateParts = Split(Mid(Trim(objCell.Value), 1, InStr(Trim(objCell.Value), " ") - 1), "/") 
166.
 
167.
      '...und das Format von YYYY/MM/DD in DD/MM/YYYY wandeln 
168.
      If UBound(arrDateParts) = 2 Then 
169.
        objCell.Value = arrDateParts(2) _ 
170.
                          & "/" & arrDateParts(1) _ 
171.
                          & "/" & arrDateParts(0) 
172.
      End If 
173.
    End If 
174.
  Next 
175.
End Sub 
176.
 
177.
 
178.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
179.
'/ Programmparameter einlesen 
180.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
181.
Function ParseCommandLine 
182.
  On Error Resume Next 
183.
 
184.
  'Rückgabewert initialisieren 
185.
  ParseCommandLine = False 
186.
 
187.
  'Abbruch wenn keine Parameter übergeben wurden 
188.
  If colArgs.Count < 1 Then Exit Function 
189.
   
190.
  'Wenn mindestens ein unnamed Parameter übergeben wurde, ... 
191.
  If colArgs.Unnamed.Count > 0 Then 
192.
    '...diesen als Pfad zur CSV-Eingabedatei interpretieren und 
193.
    'den vollständigen Pfad der Datei ermitteln... 
194.
    strInFile = objFSO.GetAbsolutePathName(colArgs.Unnamed.Item(0)) 
195.
  Else 
196.
    '...sonst Abbruch und einen Fehler zurückmelden 
197.
    Exit Function 
198.
  End If 
199.
   
200.
  'Wenn ein named Parameter mit der Bezeichnung fc übergeben wurde, ... 
201.
  If colArgs.Named.Exists("fc") Then 
202.
    '...diesen als Pfad zur Konfigurationsdatei interpretieren und 
203.
    'den vollständigen Pfad der Datei ermitteln... 
204.
    strConfigFile = objFSO.GetAbsolutePathName(colArgs.Named.Item("fc")) 
205.
  Else 
206.
    '...sonst den Pfad zur Konfigurationsdatei aus dem Pfad des Scripts 
207.
    'und einem Standarddateinamen erzeugen 
208.
    strConfigFile = objFSO.BuildPath(objFSO.GetParentFolderName(strScriptPath), strConfigFile) 
209.
  End If 
210.
   
211.
  'Wenn ein named Parameter mit der Bezeichnung fo übergeben wurde, ... 
212.
  If colArgs.Named.Exists("fo") Then 
213.
    '...diesen als Pfad zur Ausgabedatei interpretieren und 
214.
    'den vollständigen Pfad der Datei ermitteln... 
215.
    strOutFile = objFSO.GetAbsolutePathName(colArgs.Named.Item("fo")) 
216.
  Else 
217.
    '...sonst den Pfad zur Ausgabedatei aus Pfad und Name der Eingabedatei 
218.
    ' und einer Ergänzung erzeugen 
219.
    strOutFile = objFSO.BuildPath(objFSO.GetParentFolderName(strInFile), _ 
220.
                                  objFSO.GetBaseName(strInFile) _ 
221.
                                    & "_Neu" _ 
222.
                                    & "." _ 
223.
                                    & objFSO.GetExtensionName(strInFile)) 
224.
  End If 
225.
   
226.
  'Wenn wir bis hierher kommen, haben wir alle benötigten Parameter 
227.
  'und können mit einer Erfolgsmeldung zurückspringen 
228.
  ParseCommandLine = True 
229.
End Function 
230.
 
231.
 
232.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
233.
'/ Konfigurationsdatei einlesen 
234.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
235.
Function LoadConfigFile(strFileName) 
236.
  On Error Resume Next 
237.
 
238.
  Dim objInStream, strLine, arrTokens, intFilePart 
239.
 
240.
  'Steuerflag initialisieren 
241.
  intFilePart = 1 
242.
 
243.
  'Konfigurationsdatei zum Lesen öffnen 
244.
  'Die Datei muss aus drei Abschnitten bestehen, die durch genau eine 
245.
  'Leerzeile voneinander getrennt sind. 
246.
  'Der erste Abschnitt enthält die Titel der Spalten, die gelöscht werden sollen. 
247.
  'Um auch leere Spaltentitel angeben zu können, müssen diese als zwei aufeinander- 
248.
  'folgende Anführungszeichen eingetragen werden 
249.
  'Der zweite Abschnitt muss die Zuordnung Codenummern->Inhaltsstoffe enthalten 
250.
  'und der dritte Abschnitt die Zuordnung Spaltentitel->Neuer Spaltentitel 
251.
  Set objInStream = objFSO.OpenTextFile(strFileName, ForReading, False) 
252.
   
253.
  If Err.Number <> 0 Then 
254.
    LoadConfigFile = False 
255.
    Exit Function 
256.
  End If 
257.
 
258.
  'Bis zum Dateiende lesen 
259.
  Do While Not objInStream.AtEndOfStream 
260.
    'Eine Zeile lesen 
261.
    strLine = Trim(objInStream.ReadLine) 
262.
 
263.
    'Bei einer Leerzeile wird der aktuelle Dateiabschnitt als beendet angesehen 
264.
    If strLine = "" Then 
265.
      intFilePart = intFilePart + 1 
266.
 
267.
    'Kommentarzeilen werden überlesen 
268.
    ElseIf Left(strLine, 1) = "#"  Then 
269.
      'Nichts machen 
270.
     
271.
    'Dateiabschnitt 1 parsen 
272.
    ElseIf intFilePart = 1 Then 
273.
      'Neues Element im Array anlegen 
274.
      ReDim Preserve arrColumnsToDelete(UBound(arrColumnsToDelete) + 1) 
275.
 
276.
      'Zeileninhalt speichern und dabei die umgebenden Anführungszeichen löschen 
277.
      arrColumnsToDelete(UBound(arrColumnsToDelete)) = UnQuote(strLine) 
278.
 
279.
    'Dateiabschnitte 2 und 3 parsen 
280.
    Else 
281.
      'Die Zeile anhand des Gleichheitszeichens in Tokens zerlegen 
282.
      arrTokens = Split(strLine, "=") 
283.
 
284.
      'Falls in der Konfigurationsdatei nach dem Gleichheitszeichen nichts steht, 
285.
      'soll der zu dem Schlüssel gehörende Wert wohl gelöscht werden 
286.
      If UBound(arrTokens) = 0 Then 
287.
        ReDim Preserve arrTokens(1) 
288.
        arrTokens(1) = "" 
289.
      End If 
290.
 
291.
      'Dafür sorgen, dass das Gleichheitszeichen 
292.
      'auch Bestandteil des Wertes sein kann... 
293.
      arrTokens(1) = Join(Slice(arrTokens, 1, UBound(arrTokens)), "=") 
294.
 
295.
      '...und die Schlüssel/Wert-Paare aus den verschiedenen Dateiabschnitten 
296.
      'in verschiedenen Dictionary-Objekten speichern, aber nur, wenn der 
297.
      'Schlüssel noch nicht im Dictionary existiert 
298.
      Select Case intFilePart 
299.
        Case 2 
300.
        If Not dicCodeNumbers.Exists(Trim(arrTokens(0))) Then 
301.
          Call dicCodeNumbers.Add(Trim(arrTokens(0)), Trim(arrTokens(1))) 
302.
        End If 
303.
 
304.
        Case 3 
305.
        If Not dicColHeaders.Exists(Trim(arrTokens(0))) Then 
306.
          Call dicColHeaders.Add(Trim(arrTokens(0)), Trim(arrTokens(1))) 
307.
        End If 
308.
      End Select 
309.
    End If 
310.
  Loop 
311.
 
312.
  'Eingabedatei schließen 
313.
  objInStream.Close 
314.
 
315.
  'Ergebnis zurückliefern 
316.
  LoadConfigFile = True 
317.
End Function 
318.
 
319.
 
320.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
321.
'/ CSV-Datei in Excel laden 
322.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
323.
Function OpenCSVFile(strFileName) 
324.
  On Error Resume Next 
325.
 
326.
  Dim objActiveWorkBook, objActiveSheet 
327.
  Dim arrColumnFormats(200), intCnt, bolResult 
328.
 
329.
  bolResult = False 
330.
 
331.
  'Array mit Format-Codes für die ersten 200 Spalten erzeugen 
332.
  'Die Spalten sollen als Nur-Text eingelesen werden 
333.
  For intCnt = 0 to UBound(arrColumnFormats) 
334.
    arrColumnFormats(intCnt) = 2  'xlTextFormat 
335.
  Next 
336.
 
337.
  'Excel-Instanz starten 
338.
  Set objExcel           = CreateObject("Excel.Application") 
339.
  'Unsichtbar schalten 
340.
  objExcel.Visible       = False 
341.
  'Beim Schließen von Excel keine Nachfrage zum Speichern anzeigen 
342.
  objExcel.DisplayAlerts = False 
343.
 
344.
  'Arbeitsmappe hinzufügen und aktives Arbeitsblatt holen 
345.
  Set objActiveWorkBook = objExcel.WorkBooks.Add(-4167)  'xlWBATWorksheet 
346.
  Set objActiveSheet    = objActiveWorkBook.WorkSheets(1) 
347.
 
348.
  'CSV-Datei einlesen 
349.
  With objActiveSheet.QueryTables.Add("TEXT;" & strFileName, objActiveSheet.Range("A1")) 
350.
    .Name                         = "Messergebnis" 
351.
    .FieldNames                   = False             'Erste Zeile enthält keine Spaltennamen 
352.
    .RowNumbers                   = False             'Erste Spalte enhält keine Zeilennummern 
353.
    .FillAdjacentFormulas         = False             'Nicht nach Formeln suchen, die aktualisiert werden müssen 
354.
    .PreserveFormatting           = False             'Die Formatierung der Zellen in den ersten 5 Zeilen nicht für neue Zeilen übernehmen 
355.
    .RefreshStyle                 = 0                 'xlOverwriteCells, Zelleninhalte überschreiben 
356.
    .AdjustColumnWidth            = True              'Spaltenbreite an den Inhalt anpassen 
357.
    .RefreshPeriod                = 0                 'Automatische Aktualisierung der Daten ausschalten 
358.
    .TextFilePlatform             = 1252              'Codepage der Eingabedatei, 1252 ist die Standard-Windows-Codpage, 65001 steht für UTF-8 
359.
    .TextFileStartRow             = 1                 'Daten ab Zeile 1 einlesen 
360.
    .TextFileParseType            = 1                 'xlDelimited, Spalteninhalte sind durch Trennzeichen separiert 
361.
    .TextFileTabDelimiter         = False             'Tab ist erlaubtes Feld-Trennzeichen: nein 
362.
    .TextFileSemicolonDelimiter   = False             'Semikolon ist erlaubtes Feld-Trennzeichen: nein 
363.
    .TextFileCommaDelimiter       = True              'Komma ist erlaubtes Feld-Trennzeichen: ja 
364.
    .TextFileSpaceDelimiter       = False             'Leerzeichen ist erlaubtes Feld-Trennzeichen: nein 
365.
    .TextFileOtherDelimiter       = ""                'Kein alternatives Trennzeichen 
366.
    .TextFileConsecutiveDelimiter = False             'Aufeinanderfolgende Trennzeichen nicht als ein Trennzeichen behandeln 
367.
    .TextFileTextQualifier        = 1                 'xlTextQualifierDoubleQuote, Anführungszeichen sind Begrenzer für Text-Inhalte 
368.
    .TextFileColumnDataTypes      = arrColumnFormats  'Format-Codes der Spalten 
369.
    .TextFileTrailingMinusNumbers = False             'Auch negative Zahlen als Text importieren 
370.
 
371.
    'Wenn bisher kein Fehler aufgetreten ist, die Datei laden 
372.
    'und warten bis der Ladevorgang abgeschlossen ist 
373.
    If Err.Number = 0 Then 
374.
      bolResult = .Refresh(False) 
375.
    End If 
376.
  End With 
377.
 
378.
  'Wenn der Ladevorgang fehlschlug, Excel beenden und das Objekt vernichten 
379.
  If Err.Number <> 0 Or Not bolResult Then 
380.
    objExcel.Quit 
381.
    objExcel = Nothing 
382.
  End If 
383.
 
384.
  'Ergebnis zurückliefern 
385.
  OpenCSVFile = (Err.Number = 0 And bolResult) 
386.
End Function 
387.
 
388.
 
389.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
390.
'/ Geänderte CSV-Datei mit eigener Routine speichern 
391.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
392.
Sub SaveCSVFile(strFilePath) 
393.
  On Error Resume Next 
394.
 
395.
  Dim objOutStream 
396.
  Dim objActiveSheet, objRow, objCell 
397.
  Dim strLine 
398.
 
399.
  'Aktives Arbeitsblatt holen 
400.
  Set objActiveSheet = objExcel.ActiveSheet 
401.
 
402.
  'Zieldatei öffnen 
403.
  Set objOutStream = objFSO.CreateTextFile(strFilePath, True) 
404.
 
405.
  'Alle Zeilen des Arbeitsblatts verarbeiten 
406.
  For Each objRow In objActiveSheet.UsedRange.Rows 
407.
    strLine = "" 
408.
 
409.
    'Alle Zellen der aktuellen Zeile verarbeiten 
410.
    'und zu einem String zusammensetzen 
411.
    For Each objCell In objRow.Cells 
412.
      'Den Inhalt der nicht-leeren Zellen aus Zeile 2 in Anführungszeichen 
413.
      'einschließen, alle anderen Zellen ohne Anführungszeichen speichern 
414.
      If objCell.Row = 2 And Trim(objCell.Value) <> "" Then 
415.
        strLine = strLine & """" & Trim(objCell.Value) & """;" 
416.
      Else 
417.
        strLine = strLine & Trim(objCell.Value) & ";" 
418.
      End If 
419.
    Next 
420.
 
421.
    'Zeileninhalt in die Zieldatei schreiben, 
422.
    'dabei das Semikolon am Zeilenende entfernen 
423.
    objOutStream.WriteLine Left(strLine, Len(strLine) - 1) 
424.
  Next 
425.
 
426.
  'Zieldatei schließen 
427.
  objOutStream.Close 
428.
End Sub 
429.
 
430.
 
431.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
432.
'/ Entfernt umschließende Anführungszeichen 
433.
'/ aus einem String 
434.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
435.
Function UnQuote(ByRef strInString) 
436.
  On Error Resume Next 
437.
 
438.
  If Left(strInString, 1) = """" And Right(strInString, 1) = """" Then 
439.
    If Len(strInString) = 2 Then 
440.
      UnQuote = "" 
441.
    Else 
442.
      UnQuote = Mid(strInString, 2, Len(strInString) - 2) 
443.
    End If 
444.
  Else 
445.
    UnQuote = strInString 
446.
  End If 
447.
End Function 
448.
 
449.
 
450.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
451.
'/ Erzeugt aus einem Teilbereich des Eingabearrays 
452.
'/ ein neues Array 
453.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
454.
Function Slice(ByRef arrIn, intStart, intEnd) 
455.
  On Error Resume Next 
456.
 
457.
  Dim intCnt, arrOut 
458.
 
459.
  arrOut = Array() 
460.
 
461.
  If intEnd >= intStart Then 
462.
    ReDim arrOut(intEnd - intStart) 
463.
 
464.
    For intCnt = intStart To intEnd 
465.
      arrOut(intCnt - intStart) = arrIn(intCnt) 
466.
    Next 
467.
  End If 
468.
 
469.
  Slice = arrOut 
470.
End Function 
471.
 
472.
 
473.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
474.
'/ Fehlermeldung für fehlende Parameter anzeigen 
475.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
476.
Sub ShowParamsError 
477.
  On Error Resume Next 
478.
 
479.
  MsgBox "Sie müssen den Pfad zu einer Eingabedatei übergeben.", _ 
480.
         vbCritical+vbOKOnly, _ 
481.
         strScriptName 
482.
End Sub 
483.
 
484.
 
485.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
486.
'/ Fehlermeldung für Dateiladefehler anzeigen 
487.
'/ / / / / / / / / / / / / / / / / / / / / / / / / / / 
488.
Sub ShowFileLoadError(strFilePath) 
489.
  On Error Resume Next 
490.
 
491.
  MsgBox "Fehler beim Laden der Datei" & vbCrLf _ 
492.
           & vbCrLf _ 
493.
           & strFilePath & vbCrLf, _ 
494.
         vbCritical+vbOKOnly, _ 
495.
         strScriptName 
496.
End Sub

Einstellungen

In Zeile 31 wird der Name der Konfigurationsdatei festgelegt, der die Informationen für die auszuführenden Änderungen enthält. Die Datei wird im gleichen Verzeichnis erwartet, in dem das Script gespeichert ist.

Anwendung

Den Code bitte mit der Dateiendung vbs speichern. Die Eingabedateien können per Drag&Drop (Icon der Eingabedatei mit der Maus auf das Icon des Scripts ziehen und "fallen lassen") an das Script übergeben werden oder durch folgende Kommandozeile von einer Konsole aus:
cscript /nologo "PfadUndNameDesScripts.vbs" "PfadUndNameDerEingabedatei.csv"
Das Script erzeugt als Ausgabe eine neue Datei mit dem Namen NameDerEingabedatei_Neu.csv.

Es wird davon ausgegangen, dass die Eingabedateien mit der Codepage 1252 codiert sind.

Bemerkung

Deine Messwerte werden mit einem Punkt als Dezimaltrennzeichen gespeichert. Wenn Du die Ausgabedaten mit Excel weiterverarbeiten musst, ist das ungünstig, da Excel auf einem Windowssystem mit deutschem Gebietsschema solche Werte teilweise als Datum interpretiert. In dem Fall muss man die Speicherroutine nochmal überarbeiten. Das Einlesen mit meinem Script funktioniert, weil die Einleseroutine Excel mitteilt, dass die ersten 200 Spalten (sollte auch für die Zukunft ausreichen ) als Text formatiert sind.


Gruß
Friemler


[EDIT]

Änderungen

  • Script an neue Anforderungen angepasst (Konfigurationsdatei auswerten)
  • Die Aufzählung der zu löschenden Spalten wird jetzt ebenfalls aus der Konfigurationsdatei gelesen
  • Das Script überliest jetzt Zeilen, die mit dem Zeichen # beginnen. Somit können auf diese Weise Kommentare in die Konfigurationsdatei eingebaut werden.

Hinweis zum Aufbau der Konfigurationsdatei

Die Datei muss aus drei Abschnitten bestehen, die durch genau eine Leerzeile voneinander getrennt sind.

  • Der erste Abschnitt muss die Titel der Spalten enthalten, die gelöscht werden sollen. Um auch leere Spaltentitel angeben zu können, müssen diese als zwei aufeinanderfolgende Anführungszeichen eingetragen werden
  • Der zweite Abschnitt muss die Zuordnung Codenummern->Inhaltsstoffe enthalten
  • Der dritte Abschnitt muss die Zuordnung Spaltentitel->Neuer Spaltentitel enthalten

Beispiel

# Das ist ein Kommentar 
# Hier beginnt Abschnitt 1 
R_Type1 
R_Type2 
R_No. 
Pos 
Age 
Unit 
Sex 
S_Date 
C1 
C2 
C3 
C4 
C5 
Cup 
Ope_D 
"" 
 
# Hier beginnt Abschnitt 2 
21=LACT 
22=ACT 
40=FACT 
40u=uFACT 
57=DIMER 
 
# Hier beginnt Abschnitt 3 
#S_Type=BezeichnungA 
# oder auch 
S_Type=S_Type=BezeichnungA 
S_No.=BezeichnungB 
S_ID=BezeichnungC 
M_Date=Datum
[/EDIT]



[EDIT2]

Änderungen

Das Script kann jetzt mit folgender Befehlszeile aufgerufen werden
cscript /nologo "PfadZumScript.vbs" "PfadZurEingabedatei.csv" /fc:"PfadZurKonfigurationsdatei" /fo:"PfadZurAusgabedatei"
Die Reihenfolge der Parameter, die an das VBScript übergeben werden, ist beliebig. Die Parameter /fc:... und /fo:... sind optional. Wenn Sie fehlen, verhält sich das Script genauso wie bisher.

[/EDIT2]



{EDIT3]

Änderungen

In der Konfigurationsdatei können für die Ersetzung von Codenummern jetzt Schlüssel/Wert-Paare angegeben werden, bei denen ein u an den Schlüssel (die zu ersetzende Codenummer) angehängt ist. Steht (nach dem Löschen von Zeile 1 und 3 sowie dem Löschen der in der Konfigurationsdatei angegebenen Spalten) in Spalte 1, Zeile 3 der Wert 2, wird der Wert beim Schlüssel mit angehängtem u zur Ersetzung verwendet, ansonsten der Wert beim Schlüssel ohne angehängtes u.

[/EDIT3]
Bitte warten ..
Mitglied: internet2107
08.08.2014 um 06:09 Uhr
Lieber Friemler!!.

Guten Morgen. Mal abgesehen, dass mir deine Antwort zunächst einmal den Morgen versüßt, auch wenn es nun etwas anders ist, als ich erwartet habe. Aus Powershell wird VBScript.
Deine Lösung und Antwort gefällt mir sehr gut, ich frage aber nun lieber nicht wie lange du dafür gebraucht hast. Kann ich das jemals gut machen ?

Aber das Leben wäre ja viel zu einfach, wenn es da nicht immer wieder kleine Probleme gäbe. Vielleicht hast du dafür ja auch noch eine Lösung und Antwort?.
Die Umwandlung funktioniert soweit genauso, wie sie sein soll. DANKE dafür. Oder um es mit anderen Worten zu sagen, nach dem Export aus dem Messgerät kommt eine Datei raus, die ich nur nach .csv umbenennen muss, dann über dein Script laufen lasse und schon habe ich soweit das Endergebnis. Soweit TOLL!!!.

ABER:
In der ersten Zeile erscheinen Codenummern, also so etwas wie: 21...22...40... usw.
Hinter diesen Codes sollen nachher Namen stehen, also eine Bezeichnung. Dieses passiert aktuell nachträglich per manueller Eingabe in Excel.
Ebenso sind in der zweiten Zeile noch die Bezeichungen: S_Type, S_No., S_ID, M_Date vorhanden, die auch entsprechend umbenannt werden sollen.
Das Optimum wäre nun, wenn ich in einer separaten Datei, z.B. .txt-Datei, .ini-Datei oder ?.. nun die Werte und Bezeichnungen hinterlege.

Beispiel, Datei: "codes.ini"
01.
21=LACT 
02.
22=ACT 
03.
40=FACT 
04.
57=DIMER 
05.
..... 
06.
 
07.
S_Type=BezeichnungA 
08.
S_No.=BezeichnungB 
09.
S_ID=BezeichnungC 
10.
M_Date=Datum
Wenn man das noch irgendwie miteinander verknüpfen könnte, wäre es das Optimum überhaupt und du hättest mir mehr als geholfen!!.
Bitte warten ..
Mitglied: Friemler
08.08.2014, aktualisiert um 13:20 Uhr
Hallo,

ich habe das Script in meinem Posting oben entsprechend Deinen Wünschen angepasst. Die Titel der zu löschenden Spalten werden jetzt auch aus der Konfigurationsdatei gelesen. Siehe auch mein [EDIT] des obigen Postings.

Ich bin mir aber nicht sicher, ob ich Dich richtig verstanden habe bzgl. der Ersetzung von Zelleninhalten. In der derzeitigen Version des Script werden aus der Konfigurationsdatei Schlüssel-Werte-Paare gelesen und der String links des Gleichheitszeichens durch den rechts des Gleichheitszeichens ersetzt. Ist das so korrekt?

[EDIT]
Ich habe oben noch eine Änderung nachgeschoben, durch die Du in der Konfigurationsdatei auch Einträge nach folgendem Schema vornehmen kannst:
S_Type=S_Type=BezeichnungA
Damit hat sich das Problem erledigt.
[/EDIT]

Gruß
Friemler
Bitte warten ..
Mitglied: internet2107
08.08.2014 um 13:28 Uhr
Und noch mal DANKE!!. Ich bin sprachlos. Das ist perfekt, genauso soll es sein.

Sollte noch mal eine Frage auftauchen, darf ich mich dann noch mal melden ?.
Dennoch schließe ich den Fall nun.

Schönes Wochenende !!
Bitte warten ..
Mitglied: Friemler
08.08.2014 um 13:54 Uhr
Sicher, Du kannst Dich bei Problemen gerne nochmal melden. Da ich am Wochenende arbeiten muss, kann es aber sein, dass ich mich nicht direkt melde.

Hole Dir bitte nochmals die aktuelle Version des Scripts. Da ich mehrmals Kleinigkeiten verändert habe, könnte es sein, dass Du nicht die aktuellste Version hast.

Auch Dir ein schönes Wochenende.

Gruß
Friemler
Bitte warten ..
Mitglied: colinardo
08.08.2014, aktualisiert um 17:12 Uhr
Moin,
falls es doch noch via Powershell benötigt wird, und ich das soweit richtig interpretiert habe:
(Kommentare im Code)
01.
# -------- Variablen -------------- 
02.
# Inputfile 
03.
$fileIN = "C:\temp\data.csv" 
04.
# Outputfile 
05.
$fileOUT = "C:\temp\data_final.csv" 
06.
# Spalten die nicht mit übernommen werden sollen 
07.
$skipColumns = @("1","2") 
08.
# Ersetzungen in Zeile 1 
09.
$replaceTokensRow1 = @{'21'='LACT';'22'='ACT'} 
10.
# Ersetzungen in Zeile 2 
11.
$replaceTokensRow2 = @{'S_Type'='BezeichnungA';'S_No.'='BezeichnungB'} 
12.
# --------------------------------- 
13.
 
14.
# File einlesen 
15.
$content = gc $fileIN 
16.
# doppelte Komma's entfernen 
17.
$content = $content.Replace(",,",",") 
18.
# Anzahl der Spalten ermitteln 
19.
$colCount = $content[0].Split(",").Length 
20.
# Temporäre Spaltenbeschriftungen erstellen 
21.
$header = (1..$colCount) -join "," 
22.
# Inhalt neu zusammenstellen 
23.
$arr = @(); $arr +=$header; $arr +=$content[0]; $arr +=$content[3..($content.Length - 1)] 
24.
# Objekt aus Inhalt erstellen 
25.
$obj = $arr | ConvertFrom-Csv -Delimiter "," | select * -ExcludeProperty $skipColumns  
26.
#Spaltennamen in Zeile 1 ersetzen 
27.
1..$colCount | %{if ($obj[0].$_ -ne $null -and $replaceTokensRow1.Contains($obj[0].$_)){$obj[0].$_ = $replaceTokensRow1[$obj[0].$_] }} 
28.
#Spaltennamen in Zeile 2 ersetzen 
29.
1..$colCount | %{if ($obj[1].$_ -ne $null -and $replaceTokensRow2.Contains($obj[1].$_)){$obj[1].$_ = $replaceTokensRow2[$obj[1].$_] }} 
30.
# Export in CSV 
31.
$obj | ConvertTo-Csv -Delimiter ";" -NoTypeInformation | select -Skip 1 | Set-Content $fileOUT

Grüße Uwe
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (22)

Frage von patz223 zum Thema Windows Userverwaltung ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (19)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...