Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Power Query - Chinesische Zeichen entfernen
#1
Question 
Grüßt euch,

ich möchte via PowerQuery alle chinesischen Zeichen in einer Spalte entfernen und habe dazu eine Funktion geschrieben. Jedoch spuckt diese mir einen Error aus und ich komme einfach nicht dahinter wo das Problem liegt.  Huh Angry

Code:
let
    Quelle = Excel.CurrentWorkbook(){[Name="Mustermappe"]}[Content],
    #"Entfernte oberste Zeilen" = Table.Skip(Quelle,5),
    RemoveChineseChars = (text as text) as text =>
        let
            // Funktion, die prüft, ob das Zeichen KEIN chinesisches Zeichen ist
            IsNotChineseChar = (c as text) as logical => not (Character.ToNumber(c) >= 0x4E00 and Character.ToNumber(c) <= 0x9FFF),
            // Alle Zeichen auswählen, die keine chinesischen Zeichen sind
            CleanText = Text.Select(text, IsNotChineseChar)
        in
            CleanText,
    // Anwenden der Funktion auf die gewünschte Spalte
    TransformedTable = Table.TransformColumns(#"Entfernte oberste Zeilen", {{"Column2", each RemoveChineseChars(_), type text}})
in
    TransformedTable

Ich hoffe ihr könnt mir weiterhelfen.

Vielen Dank und liebe Grüße
Mitness
Mit freundlichen Grüßen

Mitness 43
Antworten Top
#2
Wie wäre es mit
Code:
= Table.AddColumn(Input, "NoChinese", each Text.Select([Column2], List.Transform({0..255}, (x)=>Character.FromNumber(x))))
Antworten Top
#3
Gibt es nicht auch eine Lösung ohne eine extra Spalte anzulegen?  Huh
Mit freundlichen Grüßen

Mitness 43
Antworten Top
#4
Ich dachte, es geht um das Ersetzen der chinesischen Zeichen.
[-] Folgende(r) 1 Nutzer sagt Danke an Warkings für diesen Beitrag:
  • Elex
Antworten Top
#5
Unglaublich das mir die "Text.Select" bisher nie über den Weg gelaufen ist. Direkt mal im Buch von Hand eingetragen.
Antworten Top
#6
Und unglaublich, dass der OP anscheinend nicht in der Lage ist, die Transferleistung zu erbringen, nämlich 
Code:
= Table.AddColumn(Input, "NoChinese", each Text.Select([Column2], List.Transform({0..255}, (x)=>Character.FromNumber(x))))
in 
Code:
= Table.TransformColumns(Input,{"Column2", ....})

zu übersetzen. 

Oder ist der vom OP gepostete M-Code gar nicht vom OP?  Undecided
Antworten Top
#7
Ich habe es mittlerweile über eine Custom-Function gelöst:

Code:
(text as text) as text =>
let
    Chars = Text.ToList(text),
    AllowedChars = List.Select(Chars, each not (Character.ToNumber(_) = 91 or Character.ToNumber(_) = 93) and Character.ToNumber(_) <= 127),
    Result = Text.Combine(AllowedChars, ""),
    TrimmedText = Text.Trim(Result),
    CleanText = Text.Clean(TrimmedText)
in
    CleanText

Trotzdem danke für den Input.
Mit freundlichen Grüßen

Mitness 43
Antworten Top
#8
Damit werden u.a. auch die Umlaute ausgeschlossen, also nicht nur chinesische Zeichen.
Antworten Top
#9
Ist so gewollt.  57
Mit freundlichen Grüßen

Mitness 43
Antworten Top
#10
Moin,

mal so rein theoretisch: Beim Unicode-Zeichensatz müsste man zum Ausschluss Chinesischer Schriftzeichen mit Text.Select zunächst einmal 11.775 oder 19.967 Zeichen beibehalten (der erste CJK-Codeblock beginnt bei 2E00, der meistgebrauchte erst bei 4E00). Das würde im zweifel 19.967 Schleifen pro Text bedeuten. Gegebenenfalls ist es daher performanter tatsächlich alle Zeichen durch nichts zu ersetzen, die nicht in einem Codebereich liegen (ich habe die Function mal RemoveUnicodeBetween genannt). Dann müsste die Schleife nur alle Einzelzeichen des genutzten Textes durchlaufen:
Code:
(source as text, LBound as number, UBound as number) as text =>
let
    Quelle = Text.ToList(source),
    ReplacedList = List.Select(Quelle, each (Character.ToNumber(_) < LBound or Character.ToNumber(_) > UBound)),
    ReplacedText = Text.Combine(ReplacedList)
in
    ReplacedText


Die Anwendung sieht dann vielleicht etwa so aus:
Code:
let
    Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
    NurBereinigt = Table.SelectColumns(Table.AddColumn(Quelle, "Ergebnis", each RemoveUnicodeBetween([test], 500, 50000)),{"Ergebnis"})
in
    NurBereinigt


Viele Grüße
derHöpp
Antworten Top


Gehe zu:


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