washuk
Goto Top

Bestimmte Werte in CSV überschreiben mittels Makros

Guten Abend,

hat jemand vielleicht eine Idee, ob ich mittels eines Makros in einer CSV Tabelle Werte überschreiben kann.

Die CSV Tabelle ist folgernde aufgebaut:

Name6|Neme7Name8|Name9Name10|4|12345|Name11Name1201234567|0,0000

Die erste Zahl 100 ist die Referenz. Überschrieben muss die Zahl mit "0,0000".

Ich habe eine separaten Excel-Tabelle in der eine Spalte mit der Referenz und die andere mit einer Zahl befüllt ist. Leider kann ich kein SVerweis verwenden, da mich die senkrechte Trennzeichen stören.

Meine Idee wäre es erst mittels der Excel-Funktion "Text in Spalten" den Inhalt zu trennen, SVerweis durchlaufen lassen und die CSV mittels Trennzeichen wieder aufzubauen.
Ein Makro zum CSV Export dazu habe ich auf der Seite gefunden: https://lexa-it.de/2013/03/ein-kleines-excel-makro-fuer-den-csv-export-c ...

Hat vielleicht jemand eine bessere Idee?

Vielen Dank für eure Vorschläge.

Grüße
Alex

Content-ID: 384108

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

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

Arano
Arano 23.08.2018 aktualisiert um 08:52:49 Uhr
Goto Top
Moin moin

Ich habe kein MS Excel, kenne nur die OO Calc Variante bei der sich der "Import-Assistent" öffnet und zw. verschiedenen Trennzeichen wählen lässt. Kann mir denn noch nicht vorstellen das MS Excel dies nicht können sollte...

Siehe da...: https://support.office.com/de-de/article/importieren-oder-exportieren-vo ...
Sie können das Trennzeichen ändern, das in durch Trennzeichen getrennten Dateien und in CSV-Textdateien verwendet wird. Dies kann erforderlich sein um sicherzustellen, das der Import- oder Exportvorgang in der gewünschten Weise abläuft.
Gelingt, so wie ich das gerade lese, aber nur mit "*.txt"-Dateien !?
Textimport-Assistent: https://support.office.com/de-de/article/textimport-assistent-c5b02af6-f ...
[...] Handelt es sich bei der Datei um eine Textdatei (TXT), wird von Excel der Textimport-Assistent gestartet [...]
[...] Handelt es sich bei der Datei um eine CSV-Datei, wird sie von Excel automatisch geöffnet, und die Daten werden in einer neuen Arbeitsmappe angezeigt. [...]
(vermutlich mit den Standardeinstellungen seitens MS ? Also "," als Trennzeichen ?)

Du kannst deinen Plan mit dem SVERWEIS also wieder aufnehmen.

Alternativ, kannst du aber auch nach dem Ersten "|" in dem Text der Zelle suchen "=finden()" und dir die Position geben lassen, dir daraufhin mit "=links()" den "ersten Wert" in ein nebenstehende Zelle schreiben lassen, dann mit "sverweis()" deinen neuen Wert hohlen und diesen mit dem Rest des Textes, nun AB der gefundenen Postion von "|" wieder in eine weitere Zelle/Tabellenblatt zusammenbauen lassen.
...ginge auch face-smile


~Arano
erikro
erikro 23.08.2018 aktualisiert um 10:50:29 Uhr
Goto Top
Moin,

den Blödsinn, den ich vorhin geschrieben habe, habe ich mal gelöscht. Hier nun ein getesteter Ansatz, wie man das mit Powershell lösen kann:

param (

    $original = "werte.csv",  
    $neu = "neue_werte.csv"  

)

$arr_werte = Import-Csv $original -Delimiter ";"  
$arr_neue_werte = Import-Csv $neu -Delimiter ";"  

foreach($dataset in $arr_werte) {

    $new_data = ($arr_neue_werte | Where-Object { $_.ID -eq $dataset.ID })
    $dataset.wert = $new_data.neuerWert

}

$arr_werte | Export-Csv $original -Delimiter ";"   

Dabei muss natürlich die ID in beiden Dateien eindeutig sein. Die Spalte mit dem alten Wert heißt im Original "Wert" und die mit dem neuen Wert in der Korrekturdatei heißt "neuerWert". Das musst Du dann noch entsprechend angeben. Das Trennzeichen (-Delimiter) musst Du entsprechend anpassen. Wenn Du in der korrigierten Datei ein anderes haben willst als im Original, dann einfach beim Export ein anderes angeben.

<edit>Eine kleine Korrektur: Wenn im Skript oben der Datensatz in der Datei mit den neuen Werten fehlt, was ja durchaus sein kann, dann fliegt er aus der Datendatei auch raus. Das ist ja nicht so schön. ;) Deshalb ein kleines IF, um das abzufangen.

param (

    $original = "werte.csv",  
    $neu = "neue_werte.csv",  
    $delimiter_org = ";",  
    $delimiter_new = ";",  
    $delimiter_export = ";"  

)

$arr_werte = Import-Csv $original -Delimiter $delimiter_org
$arr_neue_werte = Import-Csv $neu -Delimiter $delimiter_new

foreach($dataset in $arr_werte) {

    $new_data = ($arr_neue_werte | Where-Object { $_.ID -eq $dataset.ID })

    if($new_data) {
        $dataset.wert = $new_data.neuerWert
    }

}

$arr_werte | Export-Csv $original -Delimiter $delimiter_export 
</edit>

Liebe Grüße

Erik
Washuk
Washuk 23.08.2018 um 13:10:29 Uhr
Goto Top
Hallo Arano,

vielen Dank für deinen Idee!
Washuk
Washuk 23.08.2018 um 13:19:48 Uhr
Goto Top
Hallo Erik,

vielen Dank für deine Idee und deine Bemühungen. Ich bin kein Programmierer ich verstehe nicht ganz, wie ich es mit Powershell umsetzen kann? Mit Batch-Datei?

VG
ALex
erikro
erikro 23.08.2018 um 14:15:20 Uhr
Goto Top
Moin,

Adminrechte auf dem System vorhanden?

Du kopierst das, was ich geschrieben habe, in die PowerShell ISE. Dann speichern. Powershell-Konsole mit Adminrechten starten und

set-executionpolicy unrestricted

eingeben. Danach auf der Shell (ohne Adminrechte) das Skript ausführen.

Hier nochmal eine Version, bei der Du nur den PARAM-Block anpassen musst. Ich hoffen, die Variablenbezeichnung ist verständlich.

param (

    $original = "werte.csv",  
    $neu = "neue_werte.csv",  
    $delimiter_org = ";",  
    $delimiter_new = ";",  
    $delimiter_export = ";",  
    $original_ID = "ID",  
    $neu_ID = "ID",  
    $old_field = "wert",  
    $new_field = "neuerWert"  

)

$arr_werte = Import-Csv $original -Delimiter $delimiter_org
$arr_neue_werte = Import-Csv $neu -Delimiter $delimiter_new

foreach($dataset in $arr_werte) {

    $new_data = ($arr_neue_werte | Where-Object { $_.$neu_ID -eq $dataset.$original_ID })

    if($new_data) {
        $dataset.$old_field = $new_data.$new_field
    }

}

$arr_werte | Export-Csv $original -Delimiter $delimiter_export

Liebe Grüße

Erik
Washuk
Washuk 23.08.2018 um 17:15:20 Uhr
Goto Top
Hallo Erik, danke für die Erklärung. Hab es nach deiner Anleitung gemacht und bekomme folgendes Ergebnis:

#TYPE System.Management.Automation.PSCustomObject
ID|"Datum"|"wert"|"Name1"
100|"22.08.2018"|"1,2304"|"Name1"

Wie kann ich die Ausführungszeichen zwischen den senkrechten Trennzeichen entfernen?
Wäre es auch möglich die neue_werte Tabelle als *.xlsx zu verwenden in der "ID" sowie "neuerWert" in Spalte B bzw C ohne Trennzeichen zu haben?

Viele Grüße
Alex
erikro
erikro 24.08.2018 um 09:12:17 Uhr
Goto Top
Moin,


Zitat von @Washuk:

Hallo Erik, danke für die Erklärung. Hab es nach deiner Anleitung gemacht und bekomme folgendes Ergebnis:

#TYPE System.Management.Automation.PSCustomObject
ID|"Datum"|"wert"|"Name1"
100|"22.08.2018"|"1,2304"|"Name1"

Das sieht doch schonmal gut aus.


Wie kann ich die Ausführungszeichen zwischen den senkrechten Trennzeichen entfernen?

Wenn es sein muss, mit Suchen und Ersetzen mit Hilfe von $editor. ;) Man könnte das auch ans Ende des Skripts dranhängen. Aber warum? Es macht CSV sicherer, wenn man die Werte in Anführungszeichen setzt, und jedes Programm, dass CSV kann, kann damit auch umgehen.

Wäre es auch möglich die neue_werte Tabelle als *.xlsx

Ja. Es gibt für Powershell auch Comandlets für XLSX. Hier kannst Du nachlesen, wie das geht. Vom Prinzip auch nicht anders als mit Import-CSV.

https://blogs.msdn.microsoft.com/koryt/2018/05/08/grabbing-excel-xlsx-va ...

zu verwenden in der "ID" sowie "neuerWert" in Spalte B bzw C ohne Trennzeichen zu haben?

Du willst also aus zwei Spalten, die Werte in einer (neuen) Spalte zusammenfassen?

Liebe Grüße

Erik
Washuk
Washuk 24.08.2018 um 11:10:08 Uhr
Goto Top
Hallo Erik, vielen Dank für deine Unterstützung und den Link, und werde mir das genauer anschauen.


Du willst also aus zwei Spalten, die Werte in einer (neuen) Spalte zusammenfassen?

Die Werte-Tabelle ist eine xlsx. Es sind zwei Spalten. Eine Spalte heißt ID, die andere neuerWert. Ist nur ohne Trennzeichen.

Viele Grüße
Alex
erikro
erikro 24.08.2018 um 11:19:38 Uhr
Goto Top
Moin,

gerne doch.

dann exportiere die xlsx doch einfach als csv. Beim Export kannst Du Dir dann das Trennzeichen aussuchen.

hth

Erik