it-wurzel
Goto Top

Bearbeitung einer CSV Datei an bestimmter Spalte

Hallo an alle,

ich bin gerade diesem Forum beigetreten, und wünsche allen erst einmal ein herzliches "Hallo" ...

nun zu meiner Frage:
ich habe als Ausgang eine CSV-Datei (Auszug siehe folgend) mit folgenden Inhalten (plus "X" weitere Zeilen):

'User-Nachname1';'User-Vorname1';'(OR)';'4444';'Abt. 1';''  
'User-Nachname2';'User-Vorname2';'';'+111-2-3333333';Abt. 2;''  
'User-Nachname3';'User-Vorname3';'';'+111-2-3333333';Abt. 2;''  
'User-Nachname4';'User-Vorname4';'';'4444';'Abt. 1';''  

nun besteht die Besonderheit darin (das ";" ist der delimiter), das in der 4. Spalte (Telefonnummer), eine Vorwahl und eine Rufnummer + der vorhandenen Durchwahl eingefügt werden soll (z.B. +49-40-1234-Durchwahl), aber,

hierbei ist die Besonderheit, dass auch schon komplette Telefonnummern existieren, die übergangen werden sollen.
Also nur die Zeilen "bearbeitet" werden, die nur 4 Stellen (Durchwahl) der Telefonnummer beinhalten.

Jetzt habe ich mich schon an Batch und VBS versucht, komme aber partout zu keinem brauchbaren Ergebnis (bin noch ein Neuling in der Batch und/oder VBS Programmierung.
daher würde ich mir wünschen, wenn die Lösung eine Batch-, PowerShell- oder vbs-Datei wäre

Vielen Dank schon mal im voraus für Eure Unterstützung
IT-Wurzel

Content-ID: 246360

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

Ausgedruckt am: 24.11.2024 um 07:11 Uhr

LordXearo
LordXearo 13.08.2014 aktualisiert um 11:09:20 Uhr
Goto Top
Hallo IT-Wurzel,

kannst du nicht die CSV in OpenOffice Calc / MS Excel einlesen, bearbeiten und wieder als csv abspeichern?

Gruß
Xearo
colinardo
colinardo 13.08.2014 aktualisiert um 11:11:55 Uhr
Goto Top
Moin IT-Wurzel,
das ist kein Problem. Ist deine CSV-Datei wirklich so formatiert, also hat keine Überschriften und werden einzelne Hochkommas für den Text anstatt doppelten verwendet ?

Grüße Uwe
IT-Wurzel
IT-Wurzel 13.08.2014 um 11:18:25 Uhr
Goto Top
Hallo Xearo,

leider nein, da die csv-Datei immer wieder neu erzeugt wird, und ich gerne einen Automatismus verwenden möchte, da auch der Inhalt der csv_Datei immer wieder variieren kann. (Die csv-Datei wird aus dem AD erzeugt).

Gruß,
IT-Wurzel
IT-Wurzel
IT-Wurzel 13.08.2014 um 11:22:25 Uhr
Goto Top
Hallo Uwe,

ja, die csv-Datei hat in diesem fall keine Überschrift und die Text-Elemente werden, mit Hochkommas erzeugt. eine (als Exe kompilierte) Pearl-Datei erzeugt aus dem AD diese csv-Datei ohne Überschriften, welche dann in unsere Telefonanlage eingelesen werden soll (Adressbuch), halt nur mit
vollständiger Telefonnummer.


Gruß,
IT-Wurzel
colinardo
Lösung colinardo 13.08.2014 aktualisiert um 12:51:47 Uhr
Goto Top
na dann z.B. mit Powershell so:
$fileIN = "C:\file_in.csv"  
$fileOUT = "C:\file_out.csv"  
$preNumber = '+49-40-1234-'  
$content = (gc $fileIN | out-string).Replace("'","""")  
$objCSV =  ConvertFrom-Csv $content -Delimiter ";" -Header "1","2","3","4","5","6"  
$objCSV | ?{$_.'4' -match "^\d{4}$"} | %{$_.'4' = "$preNumber$($_.'4')"}  
($objCSV | ConvertTo-Csv -Delimiter ";" -NoTypeInformation | select -skip 1 | out-string).Replace("""","'") | set-content $fileOUT  

oder ebenfalls mit Powershell in der Regular Expressions-Variante:
$fileIN = "C:\file_in.csv"  
$fileOUT = "C:\file_out.csv"  
$preNumber = '+49-40-1234-'  
$content -replace "^([^;]*;[^;]*;[^;]*;')(\d{4})('.*)$",('$1'+$preNumber+'$2$3') | set-content $fileOUT  
IT-Wurzel
IT-Wurzel 13.08.2014 um 12:23:27 Uhr
Goto Top
Hallo Uwe,

wow, danke für die schnelle Antwort... das Skript wirft mir eine Fehlermeldung aus:

ERROR: Unerwartetes Token ".4" im Ausdruck oder in der Anweisung.
ERROR: Bei C:\!Teleliste_CSV_ändern.ps1:5 Zeichen:19
ERROR: + $objCSV | ? { $_.4 <<<< -match "^\d{4}$" } | %{ $_.4 = "+49-40-1234-$($_.4)" }
ERROR: + CategoryInfo : ParserError: (.4:String) , ParseException
ERROR: + FullyQualifiedErrorId : UnexpectedToken
ERROR:

hast Du eine Idee?

Vielen Dank & Gruß,
Mario
colinardo
colinardo 13.08.2014 aktualisiert um 12:44:52 Uhr
Goto Top
OK, dann hast du noch eine ältere Powershell-Version. Mindestens PS3.0 benötigt.
IT-Wurzel
IT-Wurzel 13.08.2014 um 12:38:52 Uhr
Goto Top
leider funktioniert das auch nicht, jetzt kommt folgende FM:

ERROR: Fehler beim Aufrufen der Methode, da [System.Object[]] keine Methode mit dem Namen "Replace" enthält.
ERROR: Bei C:\!Teleliste_CSV_ändern.ps1:4 Zeichen:32
ERROR: + $content = (gc $fileIN).Replace <<<< ("'", """")
ERROR: + CategoryInfo : InvalidOperation: (Replace:String) , RuntimeException
ERROR: + FullyQualifiedErrorId : MethodNotFound
ERROR:

...
colinardo
colinardo 13.08.2014 aktualisiert um 12:45:19 Uhr
Goto Top
einen moment, war noch nicht kompett für PS 2.0 angepasst. Würde dir aber raten auf mindestens PS 3.0 aufzurüsten ...
so jetzt läufts auch mit PS 2.0

UPDATEN !! face-smile
IT-Wurzel
IT-Wurzel 13.08.2014 um 12:49:07 Uhr
Goto Top
GRANDIOS ...

jetzt läuft es, und ich gelobe auf PS 3.0 aufzurüsten face-smile


Vielen, vielen Dank
IT-Wurzel
IT-Wurzel 13.08.2014 um 16:47:34 Uhr
Goto Top
Hi,

zu Deiner super Lösung von Oben, habe ich gerade noch einen Fall in der csv-Datei gefunden, der bei ca. 2000 Zeilen erst weiter unten vorkam.
Nämlich das in Spalte 4 auch der Ausdruck
'User-Nachname5';'User-Vorname5';'';'0015112345678';'Abt. 1';''
vorkommen kann.

Jetzt habe ich versucht - auch aus Handbüchern - abzuleiten, wie ich Dein Skript um folgende Änderung in der Zieldatei erweitern kann, leider habe ich so gar kein Erfolg dabei gehabt. Kannst Du mir helfen?

Ergebnis: 'User-Nachname5';'User-Vorname5';'';'+49-15112345678';'Abt. 1';''

Also anstelle der ersten beiden "00" einfach ein "+49-" voranstellen.

Vielen Dank
colinardo
Lösung colinardo 13.08.2014 aktualisiert um 19:56:26 Uhr
Goto Top
nur Zeile 7 ist hinzugekommen
$fileIN = "C:\file_in.csv"  
$fileOUT = "C:\file_out.csv"  
$preNumber = '+49-40-1234-'  
$content = (gc $fileIN | out-string).Replace("'","""")  
$objCSV =  ConvertFrom-Csv $content -Delimiter ";" -Header "1","2","3","4","5","6"  
$objCSV | ?{$_.'4' -match "^\d{4}$"} | %{$_.'4' = "$preNumber$($_.'4')"}  
$objCSV | ?{$_.'4' -match '^00.{3,}'} | %{$_.'4' = $_.'4' -replace '^00','+49-'}  
($objCSV | ConvertTo-Csv -Delimiter ";" -NoTypeInformation | select -skip 1 | out-string).Replace("""","'") | set-content $fileOUT  
Regular Expressions Tutorial
und wenn du jetzt mit noch mehr Varianten kommst, solltest du mal folgenden Thread lesen, hatten wir vor ein paar Tagen schonmal das ganze Theater:

Grüße Uwe
IT-Wurzel
IT-Wurzel 13.08.2014 um 19:56:41 Uhr
Goto Top
Spitze, ich hatte einfach zu kompliziert gedacht und dementsprechend in meiner Lektüre nichts gefunden.
Vielen Dank.