Clever-Excel-Forum

Normale Version: Power Query - Chinesische Zeichen entfernen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
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
Wie wäre es mit
Code:
= Table.AddColumn(Input, "NoChinese", each Text.Select([Column2], List.Transform({0..255}, (x)=>Character.FromNumber(x))))
Gibt es nicht auch eine Lösung ohne eine extra Spalte anzulegen?  Huh
Ich dachte, es geht um das Ersetzen der chinesischen Zeichen.
Unglaublich das mir die "Text.Select" bisher nie über den Weg gelaufen ist. Direkt mal im Buch von Hand eingetragen.
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
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.
Damit werden u.a. auch die Umlaute ausgeschlossen, also nicht nur chinesische Zeichen.
Ist so gewollt.  57
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