CSV-Datei bestimmte Befehle automatisiert durchführen lassen.

Ask-me

Commander
Registriert
Apr. 2010
Beiträge
2.777
Hallo,
ich habe hier eine CSV Datei vorliegen, die in etwa so aussieht:

1,2,3.2
1,3,3.1
1,4,3.1
1,5,4.3
1,6,1.3

Ich würde jetzt gerne folgende Befehle automatisiert durchführen lassen:
  1. Komma durch Semikolon ersetzen
  2. Punkt durch Komma ersetzen

Man könnte es mit Excel durchführen (STRG+H und dann die einzelnen Befehle manuell durchführen), jedoch dauert es mir zu lange, da Excel ziemlich schlecht optimiert ist.

Könnte ihr mir vielleicht ein Programm empfehlen, was schneller arbeitet und vielleicht sogar automatisiert?

Danke.
 
Nimm einfach Notepad++, kann auch suchen und ersetzen und im Endeffekt ist auch eine CSV nur eine Textdatei. ALternativ wenn du es öfter brauchst bastel dir ein Script.
 
@isiprimax @Ic3HanDs

Danke. Ich habe gerade Notepad ausprobiert und da ist Excel deutlich schneller unterwegs.

Dieser Befehl hat knapp 45-60 Sekunden gedauert.
1. Komma durch Semikolon ersetzen
Ergänzung ()

Der zweite Befehlt hat nochmal 55 Sekunden in Anspruch genommen.
Ergänzung ()

Habt ihr dort vielleicht eine bessere Alternative? Besser=Schneller
 
Vermutlich ist deine Datei einfach ziemlich lang. Da wirst dann nur mit einem Script schneller werden denke ich. Denn jedes Programm muss ja alles einlesen und eben dann durchsuchen und ersetzen.
 
Ja, sind knapp 1 Millionen Stellen, die geändert werden müssen.

Da die Ausgabe der Datei jedoch immer in diesem Format geschiet, muss ich dafür eine Lösung finden.

Von der Geschwindigkeit her:
Excel>Notepad>Word
 
Dann würde ich mal ein Powershell Skript dafür empfehlen. Normalerweise geht es per Skript am schnellsten. Zudem läuft das ja im Hintergrund und kann automatisiert direkt nach der Erstellung ausgeführt werden.
 
Und vermutlich ist dieser "Ersetzvorgang ziemlich stark von der CPU abhängig, oder?
 
Ich würde es über ein Script lösen wenn es große und viele Dateien sind. Das ständige in Excel import und export wär mir schon zuviel.

Aber (Power)shellscripte können evtl. nicht an jedem Arbeitsplatz ausgeführt werden.

@Edit: Bsp Code eingefügt
PowerShell:
ForEach($Datei in Get-ChildItem 'c:\test\*.csv') {
    $Zeilen =  Get-Content -Path $Datei.Fullname
    $ZeilenZähler = 1
    foreach($Zeile in $Zeilen)
    {
        $Zeile = $Zeile.Replace(',',';').Replace('.',',')
        Write-Host "Geänderte Zeile in Datei $($Datei.Fullname)"
        Write-Host $Zeile
        If($ZeilenZähler -eq 1 ) {
           Out-File -FilePath $Datei.Fullname -InputObject $Zeile -Force
        }
        Else {
            Out-File -FilePath $Datei.Fullname -InputObject $Zeile -Force -Append
        }
        $ZeilenZähler++
    }
}
PS: Den Code habe ich aus einer anderen Quelle und nur angepasst, Rechte liegen also nicht bei mir.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Ask-me
@sikarr
Danke. Ich lasse mal Powershell einmal drüberlaufen und schaue, ob die Ausgabe korrekt ist.

Das dauert aber ziemlich lange. Powershell arbeitet schon seit Minuten daran.
 
Zuletzt bearbeitet:
Notepad: 1. Schritt etwas länger als 1 Minute, 2. Schritt: 54 Sekuden.
Excel: Etwas zügiger (vielleicht 5-10 Sekunden weniger)
 
Ich benutz dafür meist ein kleines Programm was ich in Go geschrieben habe.

Code:
package main

import (
    "os"
    "bufio"
    "strings"
)

func main() {

    // Open files
    in, err := os.OpenFile("in.csv", os.O_APPEND | os.O_CREATE, 777)
    if err != nil {
        panic(err)
    }
    defer in.Close()

    out, err := os.OpenFile("out.csv", os.O_APPEND | os.O_CREATE, 777)
    if err != nil {
        panic(err)
    }
    defer out.Close()


    // Prepare transformation
    replacer := strings.NewReplacer(",", ";", ".", ",")
    readerIn := bufio.NewReader(in)
    writerOut := bufio.NewWriter(out)

    // Replace characters one line at a time
    for {
        str, err := readerIn.ReadString('\n')
        if err != nil {
            break
        }

        writerOut.WriteString(replacer.Replace(str))
    }

    writerOut.Flush()
}

Läuft auf meinem System bei 1 Mio. Zeilen in unter 1 Sekunde (csv ist ~18 MB groß). Läuft aber auch auf einer NVMe SSD + i7 @ 5GHZ.
 
  • Gefällt mir
Reaktionen: Ask-me
@Hooo

Was heißt go?

Welches Programm verwendest du? 1 Sekunde wäre fantastisch.
Ergänzung ()

Das von Sakarr gepostete Programm hat mehr als eine halbe Stunde gebraucht. Aber das Ergebnis ist richtig.
Ergänzung ()


Muss ich dort den Pfad der Dateil angeben?
 
Go ist eine Programmiersprache von Google. Um ein lauffähiges Programm aus dem Quelltext zu erzeugen brauchst du also erstmal: https://golang.org/. Dann kannst du das Programm z.B. mit go run programm.go starten.

Und ja, in.csv ist deine bereits existierende CSV und out.csv die erzeugte, transformierte Datei. Die beiden kannst du dann einfach anpassen.
 
Zurück
Oben