UTF-8 Datei mit Sonderzeichen einlesen per Makro
#1
Ich suche eine Möglichkeit CSV Dateien im UTF-8 Format per Makro einzulesen.

Von Hand geht es problemlos (wie hier beschrieben: https://www.rechtsmedizin.med.uni-muench...index.html), Excel kann es also!

Leider kann ich nicht finden, wie ich es in einem Excel Makro aufrufen kann (Workbooks.Open, https://learn.microsoft.com/de-de/office...books.open).

Hat jemand eine Idee?

Zum besseren Verständnis/testen hier eine Liste mit den lustigen Sonderzeichen, die mir Kopfschmerzen bereiten:

Code:
Vorname,Nachname
José,González
Chloë,Moreau
Björn,Håkansson
Zoë,Müller
François,Dupont
Søren,Larsen
İbrahim,Demir
Łukasz,Kowalski
Jürgen,Schäfer
Céline,Dumont
Åsa,Lindgren
Antonín,Dvořák
Maëlle,Lefèvre
Özgür,Yılmaz
Élodie,Tremblay
Antworten Top
#2
Hallo,

hast Du schon einmal versucht, Deine manuellen Schritte zum Einlesen der Datei mit dem Makro-Rekorder auszunehmen? Ja? Was ist denn dabei herausgekommen?
[Bild: attachment-190.gif]
Gruß Günter
aus der Helden-, Messe-, Musik-, Buch-, Universitäts- und Autostadt Leipzig
[-] Folgende(r) 1 Nutzer sagt Danke an Glausius für diesen Beitrag:
  • ExcelEnte
Antworten Top
#3
(06.12.2024, 18:05)Glausius schrieb: Hallo,

hast Du schon einmal versucht, Deine manuellen Schritte zum Einlesen der Datei mit dem Makro-Rekorder auszunehmen? Ja? Was ist denn dabei herausgekommen?

Heute hat man doch für so etwa KI, mein Prompt hat sofort funktionierenden Code ergeben
Code:
Function ReadUTF8FileToString(filePath As String) As String
    Dim fileContent As String
    Dim fileStream As Object
   
    On Error GoTo ErrorHandler
   
    ' Create an instance of the ADODB Stream object
    Set fileStream = CreateObject("ADODB.Stream")
    With fileStream
        .Type = 2 ' Specify text stream
        .Charset = "UTF-8" ' Specify UTF-8 encoding
        .Open
        .LoadFromFile filePath
        fileContent = .ReadText
        .Close
    End With
   
    ' Return the read content
    ReadUTF8FileToString = fileContent
    Exit Function

ErrorHandler:
    ' Handle errors and return an empty string in case of failure
    ReadUTF8FileToString = ""
    MsgBox "Error reading file: " & Err.Description, vbCritical
End Function

Code:
Sub TestReadUTF8File()
    Dim filePath As String
    Dim fileContent As String
   
    filePath = "C:\Temp\sample_utf8.txt" ' Update this path to your file location
    fileContent = ReadUTF8FileToString(filePath)
   
    If fileContent <> "" Then
        MsgBox "File Content:" & vbCrLf & fileContent
    Else
        MsgBox "Failed to read the file or the file is empty.", vbExclamation
    End If
End Sub

PS Ich hatte explizit VBA im Prompt geschrieben, also gibt es VBA Code
PPS Powerquery M-COde wird auch geliefert und wenn man will, auch die Beschreibung wie man es in der GUI macht
[-] Folgende(r) 1 Nutzer sagt Danke an Warkings für diesen Beitrag:
  • ExcelEnte
Antworten Top
#4
Wenn du meinst, daß deine KI hier richtig liegt bzw. dafür schon eine KI notwendig ist, aber normalerweise werden CSV Dateien nicht geöffnet und eingelesen, sondern sollten importiert werden, z.B. mit dem QueryTable-Objekt. Mit der Property ".TextFilePlatform = 65001" wird dann eingestellt, daß die Ursprungsdatei im UTF-8 Format ist.

Das entspricht dann auch dem , was schon manuell mit dem "alten" Textimportassistenten gemacht worden ist.

Gruß
Knobbi38
Antworten Top
#5
Bei der Makro Aufzeichnung kam was heraus, aber nichts was mir geholften hätte, leider. Aber die Idee war auf jeden Fall gut.

Der Import mit der Funktion (Stream lesen) hat funktioniert!
Antworten Top
#6
Zitat:Bei der Makro Aufzeichnung kam was heraus, aber nichts was mir geholften hätte, leider.
Wo war jetzt damit das Problem?
Welchen Code hast du denn letztendlich verwendet?
Antworten Top
#7
Das macht genau das, was ich gesucht habe Smile

Code:
    Function ReadUTF8CSVToSheet(file As String)
        Dim ws As Worksheet
        Dim strText As String
   
        ' read utf-8 file to strText variable
      With CreateObject("ADODB.Stream")
            .Open
            .Type = 1  ' Private Const adTypeBinary = 1
            .LoadFromFile file
            .Type = 2  ' Private Const adTypeText = 2
            .Charset = "utf-8"
            strText = .ReadText(-1)  ' Private Const adReadAll = -1
        End With
   
        ' parse strText data to a sheet
        Set ws = Sheets.Add()
        intRow = 1
        For Each strLine In Split(strText, Chr(10))
            If strLine <> "" Then
                With ws
                    .Cells(intRow, 1) = strLine
                    .Cells(intRow, 1).TextToColumns Destination:=Cells(intRow, 1), DataType:=xlDelimited, _
                        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
                        Semicolon:=True, Comma:=False, Space:=False, Other:=False
                End With
   
                intRow = intRow + 1
            End If
        Next strLine
   
        ReadUTF8CSVToSheet = ws.Name
   
    End Function
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste