Top-Themen

Aktuelle Themen (A bis Z)

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 Biber am 27.04.2010 um 14:13:48 Uhr
Hier stehen bis heute, 27.4..2010 schon so viele kompetente Antworten...
Deshalb setze ich den Beitrag jetzt auf "Beantwortet", egal ob sich Klinger85 jemals wieder meldet oder nicht.
GELÖST

Zwei CSV Dateien verknüpfen

Frage Entwicklung Batch & Shell

Mitglied: Klinger85

Klinger85 (Level 1) - Jetzt verbinden

20.04.2010, aktualisiert 27.04.2010, 6234 Aufrufe, 15 Kommentare

Hallo zusammen,

ich habe das Problem das ich Informationen, sprich Spalten, aus zwei CSV Dateien miteinander verknüpfen möchte.

Zum Beispiel habe ich eine CSV mit den Namen (
ID,Name
1,Huber
2,Meier
3,Schmid
4,Mueller
) und eine zweite mit dem dazugehörigem Ort (
ID,Ortsname
3,Berlin
1,Hamburg
4,Stuttgart
2,Muenchen
). Nun möchte ich anhand der „Spalte“ „ID“ automatisiert folgende Ausgabe zustande bringen:
ID,Name,Ortsname
1,Huber,Hamburg
2,Meier,Muenchen
3,Schmid,Berlin
4,Mueller,Stuttgart

Ich habe es bereits mit der PowerShell, VBSkript und mit dem MS Log Parser versucht, bin jedoch nicht zu einem passenden Ergebnis gekommen.
Das Ergebnis sollte dann wiederrum eine CSV Datei sein.

Schon mal vorab vielen Dank für eure Hilfe...
Mitglied: LotPings
20.04.2010 um 15:08 Uhr
Zitat von Klinger85:
Ich habe es bereits mit der PowerShell, VBSkript und mit dem MS Log Parser versucht, bin jedoch nicht zu einem passenden Ergebnis
gekommen.

Dann zeig doch mal deine Versuche, es wird sich schon jemand finden der den Finger an die richtige(falsche) Stelle legt

Gruß
LotPings
Bitte warten ..
Mitglied: Klinger85
20.04.2010 um 15:19 Uhr
Mein Problem liegt darin die korrekten Zeilen zuzuordnen.
Bspw. bin ich im Netz auf der Seite http://poshcode.org/1654 auf ein PowerShellSkript gestossen,
das sich genau richtig anhört.

Jedoch überschreibt das Skript scheinbar immer den Wert, denn als Ergebnis erhalte ich foglendes:
ID,Name,Ortsname
1,Huber,Muenchen
2,Meier,Muenchen
3,Schmid,Muenchen
4,Mueller,Muenchen

Da "Muenchen" der letzte Wert in der zweiten Datei ist...
Bitte warten ..
Mitglied: bastla
20.04.2010 um 16:23 Uhr
Hallo Klinger85 und willkommen im Forum, hallo LotPings!

Um das etwas abzukürzen : Ich bin in meinem Editor auf folgenden Batch gestoßen:
01.
@echo off & setlocal 
02.
set "Namen=D:\Namen.txt" 
03.
set "Orte=D:\Ortsnamen.txt" 
04.
set "Gesamt=D:\Gesamt.txt" 
05.
 
06.
>"%Gesamt%" echo ID,Name,Ortsname 
07.
for /f "usebackq skip=1 tokens=1,2 delims=," %%i in ("%Namen%") do for /f "tokens=2 delims=," %%a in ('findstr /b /c:"%%i," "%Orte%"') do >>"%Gesamt%" echo %%i,%%j,%%a
Grüße
bastla
Bitte warten ..
Mitglied: LotPings
20.04.2010 um 16:53 Uhr
Hallo bastla,

ja, die Aufgabenstellung kam mir schon bekannt vor

@Klinger85,
ich hab mir das PowerShell Script mal angesehen, läuft bei mir nicht wegen PosH 2.1
Mein Win7-64 hat nur PoSh 2.0. Wenn ich das ignoriere sieht bei mir das Ergebnis genauso aus.
Das ist aber zu komplex um es mal eben zu untersuchen, vielleicht später einmal.

Gruß
LotPings
Bitte warten ..
Mitglied: bastla
20.04.2010 um 17:05 Uhr
@LotPings
ja, die Aufgabenstellung kam mir schon bekannt vor
Na gut, dann eben mal etwas Abwechslung :
01.
Namen = "D:\Namen.txt" 
02.
Orte = "D:\Ortsnamen.txt" 
03.
Gesamt = "D:\Gesamt.txt" 
04.
Delim = "," 'Trennzeichen 
05.
 
06.
Set fso = CreateObject("Scripting.FileSystemObject") 
07.
Set d = CreateObject("Scripting.Dictionary") 'Dictionary für die Orte erstellen 
08.
 
09.
O = Split(fso.OpenTextFile(Orte).ReadAll, vbCrLf) 'gesamte Orte-Datei in Zeilen-Array einlesen ... 
10.
For i = 0 To UBound(O) '... und alle Zeilen durchgehen 
11.
    Felder = Split(O(i), Delim) 'Satz anhand des Trennzeichens aufteilen 
12.
    If Not d.Exists(Felder(0)) Then 'Feld 0 enthält den Schlüssel - noch nicht vorhanden? 
13.
        d.Add Felder(0), Felder(1) '... dann hinzufügen (mit Wert aus Feld 1) 
14.
    Else 'ansonsten Fehlermeldung und Abbruch 
15.
        WScript.Echo "Fehler in """ & Orte & """ / Zeile " & i + 1 & ": Nummer """ & Felder(0) & """ bereits für """ & d.Item(Felder(0)) & """ vorhanden!" 
16.
        WScript.Quit 
17.
    End If 
18.
Next 
19.
 
20.
N = Split(fso.OpenTextFile(Namen).ReadAll, vbCrLf) 'gesamte Namen-Datei in Zeilen-Array einlesen ... 
21.
For i = 0 To UBound(N) '... und alle Zeilen durchgehen 
22.
    Felder = Split(N(i), Delim) ''Satz anhand des Trennzeichens aufteilen 
23.
    If d.Exists(Felder(0)) Then 'Ort mit dem Schlüssel aus Feld 0 vorhanden? 
24.
        G = G & vbCrLf & N(i) & Delim & d.Item(Felder(0))' ... dann dem Ergebnisstring eine Zeilenschaltung sowie den Namens-Satz und den Ort hinzufügen 
25.
    Else 'ansonsten Fehlermeldung und Abbruch 
26.
        WScript.Echo "Fehler in """ & Namen & """ / Zeile " & i + 1 & ": Kein Ort für Nummer """ & Felder(0) & """ gefunden!" 
27.
        WScript.Quit 
28.
    End If 
29.
Next 
30.
 
31.
fso.CreateTextFile(Gesamt).Write Mid(G, 3) 'Ergebnisstring ab 3. Position (die ersten beiden Stellen enthalten eine unnötige Zeilenschaltung) in Gesamt-Datei schreiben 
32.
WScript.Echo "Fertig."
[Edit] Trennzeichen in Variable verfrachtet [/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: Klinger85
20.04.2010 um 18:54 Uhr
Hallo bastla,

dein Batch Ansatz funktioniert einwandfrei... echt super danke!!!

Aus interesse hab ich natürlich auch noch dein vbs getestet,
jedoch kommt bei mir immer ein Laufzeitfehler in Zeile 12 (Index ausserhalb des Bereichs...)
Ich hab auch mal dein "IF" weg gelassen jedoch meckert er dann an Zeile 13 (d.Add Felder(0), Felder(1)) mit dem gleichen Fehler.

Grüße und besten Dank
Stefan
Bitte warten ..
Mitglied: bastla
20.04.2010 um 19:16 Uhr
Hallo Klinger85!

Ich war eigentlich nicht davon ausgegangen, dass es Leerzeilen (oder zumindest Zeilen ohne ein Komma) in der Ortsnamen-Datei gibt ...

... aber dagegen sollte sich ja noch was machen lassen:
01.
Namen = "D:\Namen.txt" 
02.
Orte = "D:\Ortsnamen.txt" 
03.
Gesamt = "D:\Gesamt.txt" 
04.
Delim = "," 'Trennzeichen 
05.
 
06.
Set fso = CreateObject("Scripting.FileSystemObject") 
07.
Set d = CreateObject("Scripting.Dictionary") 'Dictionary für die Orte erstellen 
08.
 
09.
o = Split(fso.OpenTextFile(Orte).ReadAll, vbCrLf) 'gesamte Orte-Datei in Zeilen-Array einlesen ... 
10.
For i = 0 To UBound(o) '... und alle Zeilen durchgehen 
11.
    Felder = Split(o(i), Delim) 'Satz anhand des Trennzeichens aufteilen 
12.
    If UBound(Felder) > 0 Then 'nur, wenn der Satz mindestens 2 Felder enthält, verarbeiten ... 
13.
        If Not d.Exists(Felder(0)) Then 'Feld 0 enthält den Schlüssel - noch nicht vorhanden? 
14.
            d.Add Felder(0), Felder(1) '... dann hinzufügen (mit Wert aus Feld 1) 
15.
        Else '... ansonsten Fehlermeldung und Abbruch 
16.
            WScript.Echo "Fehler in """ & Orte & """ / Zeile " & i + 1 & ": Nummer """ & Felder(0) & """ bereits für """ & d.Item(Felder(0)) & """ vorhanden!" 
17.
            WScript.Quit 
18.
        End If 
19.
    Else 
20.
        WScript.Echo "Fehler in """ & Orte & """ / Zeile " & i + 1 & ": Unvollständiger Datensatz!" 
21.
        WScript.Quit 
22.
    End If 
23.
Next 
24.
 
25.
N = Split(fso.OpenTextFile(Namen).ReadAll, vbCrLf) 'gesamte Namen-Datei in Zeilen-Array einlesen ... 
26.
For i = 0 To UBound(N) '... und alle Zeilen durchgehen 
27.
    Felder = Split(N(i), Delim) 'Satz anhand des Trennzeichens aufteilen 
28.
    If UBound(Felder) > 0 Then 'nur, wenn der Satz mindestens 2 Felder enthält, verarbeiten ... 
29.
        If d.Exists(Felder(0)) Then 'Ort mit dem Schlüssel aus Feld 0 vorhanden? 
30.
            G = G & vbCrLf & N(i) & Delim & d.Item(Felder(0))' ... dann dem Ergebnisstring eine Zeilenschaltung sowie den Namens-Satz und den Ort hinzufügen 
31.
        Else '... ansonsten Fehlermeldung und Abbruch 
32.
            WScript.Echo "Fehler in """ & Namen & """ / Zeile " & i + 1 & ": Kein Ort für Nummer """ & Felder(0) & """ gefunden!" 
33.
            WScript.Quit 
34.
        End If 
35.
    Else 
36.
        WScript.Echo "Fehler in """ & Orte & """ / Zeile " & i + 1 & ": Unvollständiger Datensatz!" 
37.
        WScript.Quit 
38.
    End If 
39.
Next 
40.
 
41.
fso.CreateTextFile(Gesamt).Write Mid(G, 3) 'Ergebnisstring ab 3. Position (die ersten beiden Stellen enthalten eine unnötige Zeilenschaltung) in Gesamt-Datei schreiben 
42.
WScript.Echo "Fertig."
[Edit] Bezeichnung des "Orte"-Arrays "O" auf Schreibweise mit Kleinbuchstaben "o" geändert, um Verwechslung mit der Ziffer 0 vorzubeugen [/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: Biber
20.04.2010 um 20:03 Uhr
Moin bastla,

ich habe deine Korrektur gedanklich und schnipselig nachvollzogen.
Ich würde bei einem Einsatz in einem realitätsnäheren Umfeld (=mehr als 5 Zeilen in jeder der Dateien) allerdings eine kleine nervensparende Anpassung nahelegen.

Bei einer Leerzeile (oder kommalosen Zeile) in einer der CSV-Dateien grätscht das Programm professionell und elegant ab mit
>e:\schnipsel\bastlaCsvJoin.vbs 
Fehler in "D:\temp\Orte.csv" / Zeile 6: Unvollständiger Datensatz!
Blöd nur, wenn dann jemand die Leerzeile in Zeile 6 wegeditiert und wieder startet.

Dann nämlich
>e:\schnipsel\bastlaCsvJoin.vbs 
Fehler in "D:\temp\Orte.csv" / Zeile 6: Unvollständiger Datensatz! 
 
{User editiert, zählt bis drei und startet durch..} 
>e:\schnipsel\bastlaCsvJoin.vbs 
Fehler in "D:\temp\Orte.csv" / Zeile 445: Unvollständiger Datensatz! 
 
{User editiert, zählt bis dreimaldrei und startet durch..} 
>e:\schnipsel\bastlaCsvJoin.vbs 
Fehler in "D:\temp\Orte.csv" / Zeile 20045: Unvollständiger Datensatz! 
 
{User editiert, zählt bis dreiundzwanzig und startet durch..} 
...
--> Man/frau muss jede Mistzeile einzeln "reparieren", den Schnipsel neu starten und schauen, wie weit er jetzt kommt.

--> deshalb würde ich die Zeilen 21 und 33 ("Wscript.Quit") auskommentieren, alle bisher auch geschriebenen Fehlersätze genauso anmeckern wie bisher und WEITERMACHEN.

Dann habe ich ZWEI Vorteile.
a) eine erzeugte Gesamt.txt mit allen "funktionierenden" Namen x Ort-Zeilen
b) eine unveränderte, nicht manipulierte Nur-Gelesen-CSV-Datei, die ich mitsamt dem Fehlerprotokoll zurück an den Datenlieferanten schicken kann.

Grüße
Biber
Bitte warten ..
Mitglied: bastla
20.04.2010 um 21:36 Uhr
@Biber
Du hast natürlich recht, und es ist keine Frage, dass im Ernstfall die Fehlermeldungen in einer Datei landen würden und es auch nicht zum Abbruch käme ...

Da als Batch eigentlich fast ein Einzeiler genügt, sollte die (von vorneherein umfangreichere) VBS-Variante zumindest andeutungsweise einen Mehrwert bekommen, daher habe ich noch die Kontrollen (eigentlich eher zu Demozwecken) mit eingebaut.

Abgesehen davon wäre ja mit der Ursachenforschung / -behebung ohnehin, wie Du schon angemerkt hast, bei der Entstehung der "csv"-Datei anzusetzen ...

Grüße
bastla
Bitte warten ..
Mitglied: 5t8d1e
23.04.2010 um 10:45 Uhr
Hallo,

kurz und knapp würde ich es in PS so machen
01.
$user1 = import-csv users1.csv 
02.
$user2 = import-csv users2.csv 
03.
$header = "ID,Name,Ortsname" 
04.
 
05.
Add-Content -Value $header Ausgabe.csv 
06.
 
07.
foreach ($ID1 in $user1) 
08.
{ foreach ($ID2 in  $user2) 
09.
    { IF ($ID1.ID -eq $ID2.ID)  
10.
        { Add-Content -Value ($ID1.ID.ToString() + "," + $ID1.Name.ToString() + "," + $ID2.Ortsname.ToString()) Ausgabe.csv 
11.
12.
13.
}
grüße
Torsten
Bitte warten ..
Mitglied: Biber
23.04.2010 um 13:52 Uhr
...wäre natürlich schön, wenn der Fragesteller Klinger85 noch vor dem wohlverdienten Wochenende antwortet:

"Vielen Dank für die ganzen Batch-, VBS- und Powershell-Lösungen.
Aus Zeitmangel konnte ich nicht alles austesten und habe das Problem inzwischen mit dem NotePad gelöst."


Dann könnten wir diesen Beitrag endlich schließen.

Grüße
Biber
Bitte warten ..
Mitglied: 5t8d1e
23.04.2010 um 14:45 Uhr
ahoi

rofl und auf wiedersehen. Happy WE

ach egal.
Biber schöner Kommentar.

bye bye
Bitte warten ..
Mitglied: LotPings
23.04.2010 um 15:47 Uhr
Auch allen ein schönes WE,

@Torsten, auch bei PoSh führen viele Wege nach Rom, die geschachtelten Schleifen sind ein in diesem kurzen Beispiel tolerierbares "brute force".
Effizienter wäre ein Hash ArrayTable:
$namen = import-csv .\namen.csv 
$orte = @{}  
Import-Csv .\orte.csv | %{$orte.item($_.ID.ToString()) = $_.Ortsname.ToString()} 
$header = "ID,Name,Ortsname" 
 
Add-Content -Value $header Ausgabe.csv 
 
foreach ($name in $namen) 
{ Add-Content -Value ($name.ID.ToString() + "," + $name.Name.ToString() + "," + $orte[$name.ID].ToString()) Ausgabe.csv}
Gruß
Lotpings
Bitte warten ..
Mitglied: 5t8d1e
27.04.2010 um 11:44 Uhr
Hallo LotPings,

danke für das Script (ja es läuft um einiges schneller), ganze Script war auch nur ein Gedankenspiel. Habe das Script so aufgebaut wie ich es mit ausgedruckten Listen machen würde.

Mit HashTables (nicht arrays! ) habe ich noch so meine Verständnissprobleme. Eine Bitte hätte ich noch, wenn man Scripte postet, liest sich ein ForEach-Object besser als ein %. Ja ich kann es lesen, aber andere fragen sich evtl. was das sein soll.


Grüße Torsten.
Bitte warten ..
Mitglied: LotPings
27.04.2010 um 13:19 Uhr
Zitat von 5t8d1e:
Eine Bitte hätte ich noch, wenn man Scripte postet, liest sich ein ForEach-Object besser als ein %.
Ja ich kann es lesen, aber andere fragen sich evtl. was das sein soll.
Hallo Torsten,
strenggenommen ist auch foreach nur ein Alias für foreach-object, auch wenn sich der Sinn eher erschließt
alias | where {$_.Definition -eq "foreach-object"} | ft --auto 
CommandType Name    Definition 
----------- ----    ---------- 
Alias       %       ForEach-Object 
Alias       foreach ForEach-Object
Ansonsten gehört es IMHO zu Lernkurve valide Syntax Elemente zu verstehen

Gruß
LotPings

PS: Zur Klärung ggfs weiterer auftretender Fragen einfach dies eingeben
"%", "where", "ft" | %{alias $_}
oder gleich dies:
"%", "where", "ft" | %{alias $_} | %{get-help $_.Definition} | more
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Batch Datei mit einer Datenbank verknüpfen
Frage von cenguiniBatch & Shell7 Kommentare

Also, Leute. Ich habe ein Problem. Undzwar bei uns in der Firma werden verschiedene Notebooks immer neu aufgesetzt, sprich ...

Windows Netzwerk
Eigene Dateien eines Users verknüpfen?
Frage von DerNeue92Windows Netzwerk7 Kommentare

Guten Morgen liebes Forum, ich würde gerne auf meinem PC auf die Dateien eines Users zugreifen können (via Verknüpfung). ...

Outlook & Mail
CSV Datei exportieren
gelöst Frage von 117109Outlook & Mail1 Kommentar

Hallo Leute, mal eine Frage. Und zwar aus einer Ecel Datei wurde eine CSV Datei mit Kontaktenerstellt. Diese wurde ...

VB for Applications
Import von csv Dateien
Frage von KurinoKiVB for Applications6 Kommentare

Hallo, ich verwende bereits folgendes Skript für den Import meiner csv Dateien. Bei dem Import sollten die Spalten A, ...

Neue Wissensbeiträge
Windows 10

Windows 10 Hello-Anmeldung per Foto ausgehebelt

Tipp von kgborn vor 3 StundenWindows 10

Windows Hello ist eine Funktion, um sich per Fingerabdruck-, Gesichts- oder Iriserkennung bei Windows 10-Geräten anzumelden (siehe), setzt aber ...

Perl

Perl hat heute Geburtstag: 30 Jahre Perl: Lange Gesichter zum Geburtstag

Information von Penny.Cilin vor 11 StundenPerl2 Kommentare

Hallo, auch wenn es wenige wissen und noch weniger Leute es nutzen. Perl hat heute Geburtstag. 30 Jahre Perl ...

Sicherheit

Blackberry stirbt - Keine Updates für Priv mehr

Tipp von certifiedit.net vor 11 StundenSicherheit1 Kommentar

Blackberry wird zu einer 08/15 Firma und geht wohl mehr und mehr den Weg, den HTC schon ging. Von ...

Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 2 TagenWindows 1012 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Heiß diskutierte Inhalte
Windows Server
SCCM 2016: PXE Boot des Clients schlägt fehl
Frage von gabeBUWindows Server23 Kommentare

Hallo Zusammen Ich habe eine Testumgebung erstellt um über SCCM 2016 einen virtuellen Client aufzusetzen. Folgende Maschinen habe ich ...

Netzwerkgrundlagen
Belibiges Teilnetz einer Subnetzmaske rausfinden?
gelöst Frage von CenuzeNetzwerkgrundlagen19 Kommentare

Wundervollen Gutentag, mittlerweile kann ich Subnetting so einigermaßen, aber ein Problem habe ich noch. Netzwerkadresse und Boradcast errechnen ist ...

LAN, WAN, Wireless
WLAN Reichweite erhöhen mit neuer Antenne
gelöst Frage von gdconsultLAN, WAN, Wireless12 Kommentare

Hallo, ich besitze einen TL-WN722N USB-WLAN Dongle mit einer richtigen Antenne. Ich frage mich jetzt ob man die Reichweite ...

Exchange Server
Exchange empfängt Emails - Kann aber keine Senden
gelöst Frage von niklasschaeferExchange Server11 Kommentare

Hallo, ich stehe gerade bei mir zuhause vor folgender Problemstellung. Gegeben sind 2x Hyper-V Host mit Windows Server 2016 ...