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

Mitglied: Klinger85

Klinger85 (Level 1) - Jetzt verbinden

20.04.2010, aktualisiert 27.04.2010, 6760 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
CSV-Datei nach Excel importieren
Frage von mrvfbnummer2Batch & Shell5 Kommentare

Hallo Leute, ich möchte CSV-Dateien in eine Excel-Datei mit PowerSell importieren. Ich habe bereits viel ausprobiert aber habe noch ...

VB for Applications

CSV Datei automatisch bearbeiten und abspeichern

gelöst Frage von klaus1985VB for Applications6 Kommentare

Hallo , Ich habe hier jeden Monat eine CSV Datei die in unserem ERP System generiert wird und von ...

Batch & Shell

Skript für: Automatisch generierte CSV Datei

gelöst Frage von janelsaesserBatch & Shell3 Kommentare

Hallo zusammen, für einen automatischen Upload von Bilder in unser Personalsystem, brauche ich ein Skript (am besten PowerShell) welches ...

Batch & Shell

Batchdatei - CSV-Datei umbennen mit Zeitstempel

gelöst Frage von jweghornBatch & Shell7 Kommentare

Hallo zusammen, für mein Problem habe ich hier schon einiges gefunden, wurde aber für exakt meine Vorgabe nicht ganz ...

Neue Wissensbeiträge
Windows 7
Updategängelung auf Windows 10, die zweite
Information von Penny.Cilin vor 1 TagWindows 7

Hallo, da Windows 7 im kommenden Jahr nicht mehr supportet wird, werden Nutzer von Window 7 home premium wieder ...

Internet
EU-Urheberrechtsreform: Zusammenfassung
Information von Frank vor 3 TagenInternet1 Kommentar

Auf golem.de gibt es eine Analyse von Friedhelm Greis, der das Thema EU-Urheberrechtsreform gut und strukturiert zusammenfasst. Zwar haben ...

Microsoft Office

Office365 Schwachstellen bei Sicherheit und Datenschutz

Information von Penny.Cilin vor 4 TagenMicrosoft Office7 Kommentare

Auf Heise+ gibt es einen Artikel bzgl. Office365 Schwachstellen. Das ist noch ein Grund mehr seine Daten nicht in ...

Sicherheit
Schwachstellen in VPN Clients
Tipp von transocean vor 6 TagenSicherheit2 Kommentare

Moin, es gibt Sicherheitslücken bei VPN Clients namhafter Hersteller, wie man hier lesen kann. Gruß Uwe

Heiß diskutierte Inhalte
LAN, WAN, Wireless
Lancom und VLANs
Frage von TimmheLAN, WAN, Wireless11 Kommentare

Hallo an alle ich habe momentan ein sehr merkwürdiges problem bei dem ich nicht mehr weiter komme und hoffe ...

Virtualisierung
Unix System virtualisieren
Frage von BananenmeisterVirtualisierung10 Kommentare

Hallo Zusammen, Ich möchte gerne eine Virtualisierungs-Software auf meinem kleinen ML Server installieren um einige Unix Systeme zu virtualisieren. ...

Notebook & Zubehör
Hardware defekt ?
Frage von mausemuckelNotebook & Zubehör9 Kommentare

Hallo und ein schönes Osterfest an alle. Ich benötige mal euer Schwarm wissen. Ich habe hier ein Notebook Lenovo ...

Peripheriegeräte
Empfehlung für Home-USV (ca. 450VA 270W) Irgendwelche Osterpreisaktionen bekannt?
Frage von Server-NutzerPeripheriegeräte8 Kommentare

Hallo und schöne Ostern. Meine private Heim-USV Yunto Q450 (ca. 450VA 270W) hat sich nach vielen Jahren ohne Probleme ...