Почему функция M List.Transform помещает двойные кавычки вокруг строк со встроенными запятыми? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть собственный запрос Oracle, выполняющийся в книге Excel, и я передаю введенные пользователем значения из таблицы в условие запросов WHERE.

Я написал быструю функцию в M, которая, я думаю, добавляет одинарные кавычки в строку, переданную в

(x) =>
let
    string_format = "'" & x & "'"

in
    string_format

. Я применяю эту функцию к столбцу, а затем преобразую столбец в список, но любые строки со встроенными запятыми заключены в двойные кавычки

text_tbl3 = Table.TransformColumns(text_tbl2,{{"Org_Names", string_format}})
text_ls = Table.ToList(text_tbl3)

Output

Сложно увидеть, но TD, AMERITRADE окружен двойными и одинарными кавычками как это: «ТД, АМЕРИТРЕЙД». Я хочу, чтобы он читал «TD, AMERITRADE», поэтому он имеет то же форматирование, что и другие ячейки, но я не могу понять, что вызывает дополнительные двойные кавычки.

1 Ответ

1 голос
/ 21 апреля 2020

Цитирование текста

Быстрая функция в M, которая, я думаю, добавляет одинарные кавычки в строку, переданную в

Ваша функция верна. & - оператор объединения текста .

screenshot of quote_text results

Поскольку вы используете одно выражение, вы можете упростить его: удаление внутреннего выражения let..in. (Если вы не откроете advanced editor, вы не увидите внешнее выражение let..in).

quote_text = (string as text) => "'" & string & "'"

Примечание. На снимке экрана есть дополнительные кавычки

.

CHASE
CITI
"TD, AMERITRADE"

Вот почему вы в итоге набираете:

'CHASE'
'CITI'
'"TD, AMERITRADE"'

В вашей ячейке, вероятно, есть кавычки "TD, AMERITRADE", но нет других.

Получение списка через запятую в виде одной строки

Text.Combine(list, separator=", ") создаст строку, подобную CSV-файлу.

enter image description here

let
    list_names = table3[Company],
    // equivalent to: list_names = {"CHASE", "CITI", "TD, AMERITRADE"},

    without_quotes = Text.Combine(list_names, ", "),

    list_quoted = List.Transform(
        list_names,
        quote_text
    ),

    with_quotes = Text.Combine(list_quoted, ", "),

    results = [
        list_names = list_names,
        list_quoted = list_quoted,
        string_without_quotes = without_quotes,
        string_with_quotes = with_quotes,
        without_equal_to = "string = ""CHASE, CITI, TD, AMERITRADE""",
        with_equal_to = "string = ""'CHASE', 'CITI', 'TD, AMERITRADE'"""
    ]
in
    results

Как мы используем эту строку в собственном запросе?

В моем запросе используется SQL, но метод такой же для Oracle.

raw_sql_query - ваш необработанный запрос. Он использует параметр @Company

sql_parameters типа Record, который объявляет все используемые вами параметры. Здесь мы используем вашу строку с функцией qoute_text.

Value.NativeQuery вставляет параметры для вас.

let
    company = "TD, AMERITRADE",

    raw_sql_query = "
        select * from Table
            where Company = @Company
    ",

    sql_parameters = [
        Company = quote_text( company )
    ],

    source = Sql.Database(
        "localhost",
        "Adventure Works"
    ),

    results = Value.NativeQuery(
        source, 
        raw_sql_query,
        sql_parameters
    )
in
    results

Как проверить, правильно ли используется строковая функция в кавычках?

Сначала создайте новый пустой запрос. Мы вызываем quote_text(), чтобы проверить вывод.

Я использовал Record с именем results, чтобы вы могли пометить и просмотреть каждое значение на одном экране.

manual_quote использует оператор конкатенации строк для кавычек строк

quote_string( sample_string ) вставляет переменные в текстовый шаблон. Оба возвращают одну и ту же строку.

Text.Format становится чище, чем сложнее становится ваш шаблон. Эта функция достаточно проста и не обязательна.

Ваша исходная функция

Вот как выглядит ваша функция в расширенном редакторе:

let
    quote_text = (x) => 
        let
            string_format = "'" & x & "'"
        in
            string_format
in
    quote_text

Вы можете удалить внутреннюю let

let
    quote_text_simple = (string as text) =>
        "'" & string & "'"
in
    quote_text_simple

Как использовать необязательные аргументы и строки Шаблоны

let
    // a custom function to Surround a string with single quotes.    
    // A optional second argument lets you specify a different character
    quote_string = (input_string as text, optional character as text) =>
        let 
            character = if character = null then "'" else character,
            template = "#[quote]#[string]#[quote]",
            quoted_string = Text.Format(
                template,
                [
                    quote = character,
                    string = input_string
                ]
            )
        in
            quoted_string

in
    quote_string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...