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 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, 5981 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 ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst 2 Csv -Dateien zum Teil zusammenfügen (6)

Frage von Piotrney zum Thema Batch & Shell ...

Batch & Shell
Mehrere.csv Dateien zusammenfügen zu einer Datei mit bat (4)

Frage von Piotrney zum Thema Batch & Shell ...

Batch & Shell
gelöst CSV Dateien auswerten mit Script (8)

Frage von Crank69 zum Thema Batch & Shell ...

Batch & Shell
gelöst 2 CSV Dateien per Powershell vergleichen (2)

Frage von Berlin62 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...

Windows Tools
gelöst Aussendienst Datensynchronisierung (12)

Frage von lighningcrow zum Thema Windows Tools ...