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

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

Printed on: April 24, 2024 at 00:04 o'clock

Member: LordXearo
LordXearo Aug 13, 2014 updated at 09:09:20 (UTC)
Goto Top
Hallo IT-Wurzel,

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

Gruß
Xearo
Member: colinardo
colinardo Aug 13, 2014 updated at 09:11:55 (UTC)
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
Member: IT-Wurzel
IT-Wurzel Aug 13, 2014 at 09:18:25 (UTC)
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
Member: IT-Wurzel
IT-Wurzel Aug 13, 2014 at 09:22:25 (UTC)
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
Member: colinardo
Solution colinardo Aug 13, 2014 updated at 10:51:47 (UTC)
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  
Member: IT-Wurzel
IT-Wurzel Aug 13, 2014 at 10:23:27 (UTC)
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
Member: colinardo
colinardo Aug 13, 2014 updated at 10:44:52 (UTC)
Goto Top
OK, dann hast du noch eine ältere Powershell-Version. Mindestens PS3.0 benötigt.
Member: IT-Wurzel
IT-Wurzel Aug 13, 2014 at 10:38:52 (UTC)
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:

...
Member: colinardo
colinardo Aug 13, 2014 updated at 10:45:19 (UTC)
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
Member: IT-Wurzel
IT-Wurzel Aug 13, 2014 at 10:49:07 (UTC)
Goto Top
GRANDIOS ...

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


Vielen, vielen Dank
Member: IT-Wurzel
IT-Wurzel Aug 13, 2014 at 14:47:34 (UTC)
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
Member: colinardo
Solution colinardo Aug 13, 2014 updated at 17:56:26 (UTC)
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
Member: IT-Wurzel
IT-Wurzel Aug 13, 2014 at 17:56:41 (UTC)
Goto Top
Spitze, ich hatte einfach zu kompliziert gedacht und dementsprechend in meiner Lektüre nichts gefunden.
Vielen Dank.