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:
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
hat jemand vielleicht eine Idee, ob ich mittels eines Makros in einer CSV Tabelle Werte überschreiben kann.
Die CSV Tabelle ist folgernde aufgebaut:
Name6|Neme7 | Name8|Name9 | Name10|4|12345|Name11 | Name12 | 01234567|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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 384108
Url: https://administrator.de/contentid/384108
Ausgedruckt am: 22.11.2024 um 04:11 Uhr
9 Kommentare
Neuester Kommentar
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 ...
Textimport-Assistent: https://support.office.com/de-de/article/textimport-assistent-c5b02af6-f ...
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
~Arano
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 ?)[...] 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. [...]
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
~Arano
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:
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.
</edit>
Liebe Grüße
Erik
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
Liebe Grüße
Erik
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
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.
Liebe Grüße
Erik
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
Moin,
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.
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 ...
Du willst also aus zwei Spalten, die Werte in einer (neuen) Spalte zusammenfassen?
Liebe Grüße
Erik
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"
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