compubatch
Goto Top

Powershell - Batch - Dateien vergleichen und neue Datei erstellen

Liebe Gemeinde,

gibt es die Möglichkeit mit PowerShell oder Batch folgendes zu erreichen? Ich habe eine multi.csv mit X Spalten, wobei die erste Spalte eine Nummer enthält.

Daneben habe ich eine 2-spaltige single.csv - die zweite Spalte enthält auch eine Nummer, die im besten Falle in der multi.csv enthalten ist.

-> es gibt jetzt aber den Fall, dass die Nummer aus der multi.csv nicht in der single.csv vorkommt. <-

Ich würde jetzt eine outfile.csv haben, die zu einem aus beiden (multi.csv,single.csv) CSVs zusammengebaut sind und wenn die Nummer aus der ersten Spalte der multi.csv nicht in der single.csv vorkommt, soll im Outfile die nächste vorhandene Nummer ab 1000000 genommen werden, sprich die 1000002.

multi.csv:

01000212;;;;;;;;
01000214;;;;;;;;
01000232;;;;;;;;

single.csv:

1000000;01000212;
1000001;01000214;

outfile.csv:

1000000;01000212;;;;;;;;
1000001;01000214;;;;;;;;
1000002;01000232;;;;;;;;

Sonnige Grüße!

Content-Key: 3998374298

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

Printed on: April 26, 2024 at 17:04 o'clock

Mitglied: 3803037559
Solution 3803037559 Sep 20, 2022 updated at 14:36:32 (UTC)
Goto Top
$multi = ".\multi.csv"  
$single = ".\single.csv"  
$outfile = ".\outfile.csv"  

[array]$csv_multi = Import-CSV $multi -Delimiter ";" -Header (1..9)  
[array]$csv_single = Import-CSV $single -Delimiter ";" -Header (1..3)  
[int]$next = [int]($csv_single.1 | sort {[int]$_} -Descending | select -F 1) + 1

foreach($row in $csv_multi){
    $row.2 = $row.1
    $search = $csv_single | ?{$_.2 -eq $row.1}
    if ($search){
        $row.1 = $search.1
    }else{
        $row.1 = $next
        $next++
    }
}
($csv_multi | convertto-csv -Delimiter ";" -NoType | select -skip 1) -replace '"' | Set-Content $outfile  
Cheers
cg
Member: CompuBatch
CompuBatch Sep 21, 2022 updated at 11:35:21 (UTC)
Goto Top
Wenn ich hier in der mutli.csv die Kopfzeile überspringen möchte, weil diese vorhanden wäre. Wie stelle ich das an?

skip -1 

funktioniert leider nicht.

Wie kann ich hier aus der Multi.csv die Umlaute beibehalten?
Mitglied: 3803037559
3803037559 Sep 21, 2022 updated at 11:47:43 (UTC)
Goto Top
Zitat von @CompuBatch:

Wenn ich hier in der mutli.csv die Kopfzeile überspringen möchte, weil diese vorhanden wäre. Wie stelle ich das an?
[array]$csv_multi = Get-Content $multi -Encoding Default | select -skip 1 | ConvertFrom-CSV -Delimiter ";" -Header (1..9)  

Wie kann ich hier aus der Multi.csv die Umlaute beibehalten?
s. -Encoding Parameter i.o. Zeile der muss auf das Encoding deiner CSV angepasst werden (z.B. UTF8 für UTF8 oder Default für ANSI).
Member: CompuBatch
CompuBatch Sep 23, 2022 at 12:43:05 (UTC)
Goto Top
Besten Dank face-smile - bekomme ich hier in irgendeiner Weiße noch eine Optimierung rein, falls 1000 Nummern verglichen werden sollen?

Bei mir dauert es ca. eine Minute pro Nummer, wenn in der single.csv ca. 1500 Zeilen und in der multi.csv knapp 500000 Zeilen drin stehen?

Zitat von @3803037559:

Zitat von @CompuBatch:

Wenn ich hier in der mutli.csv die Kopfzeile überspringen möchte, weil diese vorhanden wäre. Wie stelle ich das an?
[array]$csv_multi = Get-Content $multi -Encoding Default | select -skip 1 | ConvertFrom-CSV -Delimiter ";" -Header (1..9)  

Wie kann ich hier aus der Multi.csv die Umlaute beibehalten?
s. -Encoding Parameter i.o. Zeile der muss auf das Encoding deiner CSV angepasst werden (z.B. UTF8 für UTF8 oder Default für ANSI).
Mitglied: 3803037559
3803037559 Sep 23, 2022 updated at 14:44:18 (UTC)
Goto Top
Zitat von @CompuBatch:
Besten Dank face-smile - bekomme ich hier in irgendeiner Weiße noch eine Optimierung rein, falls 1000 Nummern verglichen werden sollen?
?? Es werden alle Nummern in der Multi-CSV der ersten Spalte verarbeitet.
Bei mir dauert es ca. eine Minute pro Nummer, wenn in der single.csv ca. 1500 Zeilen und in der multi.csv knapp 500000 Zeilen drin stehen?
Pro Zeile der Multi-CSV eine Minute???? Kann nicht sein, dann hast du einen 386er ... Pro Zeile dauert das hier 5 Millisekunden.