Почему функция M List.Transform помещает строки со встроенными запятыми в двойные кавычки?

У меня есть собственный запрос 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)

Вывод

Трудно понять, но TD, AMERITRADE заключен в двойные и одинарные кавычки, например: «'TD, AMERITRADE'». Я хочу, чтобы он читался как «TD, AMERITRADE», поэтому он имеет такое же форматирование, как и другие ячейки, но я не могу понять, что вызывает дополнительные двойные кавычки.


person sjc725    schedule 20.04.2020    source источник
comment
Запятая - это обычный разделитель списков. Чтобы текст не разбивался на два значения через запятую, он заключен в двойные кавычки.   -  person teylyn    schedule 21.04.2020
comment
Спасибо @teylyn. Я хочу удалить двойные кавычки, потому что эти значения будут переданы в оператор WHERE, который не допускает двойных кавычек. Придется ли мне писать другую функцию для удаления двойных кавычек или есть другой способ обойти проблему?   -  person sjc725    schedule 21.04.2020
comment
Я не могу воспроизвести такое поведение. Отсутствие двойных кавычек.   -  person Alexis Olson    schedule 21.04.2020
comment
@AlexisOlson, спасибо за ваш вклад. Не знаете ли вы, как просто взять столбец и сделать его списком, разделенным запятыми? У меня есть таблица «Excel.CurrentWorkbook () {[Name = tbl_Org_Names]}», «Я новичок в M-коде, поэтому не уверен, что даст мне список.   -  person sjc725    schedule 21.04.2020


Ответы (1)


Цитирующий текст

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

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

снимок экрана с результатами quote_text

Поскольку вы используете одно выражение, вы можете упростить его, удалив внутреннее выражение 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.

введите описание изображения здесь

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
    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
person ninMonkey    schedule 21.04.2020