Могу ли я разделить текст столбца как массив, используя поток данных фабрики данных?

Внутри моего конвейера потока данных я хотел бы добавить производный столбец, а его тип данных — массив. Я хотел бы разделить существующий столбец на 1000 символов, не разбивая слов. Я думаю, мы можем использовать regexSplit,

regexSplit(<string to split> : string, <regex expression> : string) => array

Но я не знаю, какое регулярное выражение я могу использовать для разделения существующего столбца без разрыва слов. Пожалуйста, помогите мне разобраться.


person Syam Kumar    schedule 30.06.2020    source источник
comment
Под разделением существующего столбца на 1000 символов вы имеете в виду, что общая длина столбца в настоящее время составляет 1000 символов, и вы хотите разделить его пополам, или вы хотите, чтобы каждый элемент массива составлял 1000 символов?   -  person jdaz    schedule 06.07.2020
comment
Да @jdaz, я хочу, чтобы каждый элемент массива состоял из 1000 символов. Если 1000-й символ находится в середине слова, длина элемента массива меньше 1000.   -  person Syam Kumar    schedule 06.07.2020


Ответы (2)


Я создал обходной путь для этого, и он отлично работает для меня.

filter(split(regexReplace(regexReplace(text, `[\t\n\r]`, ``), `(.{1,1000})(?:\s|$)`, `$1~~`), '~~'), #item !="")

Я думаю, у нас есть лучшее решение, чем это.

person Syam Kumar    schedule 07.07.2020

Я бы использовал для этого не регулярное выражение, а функцию усечения, подобную этой, любезно предоставленную TimS:

public static string TruncateAtWord(this string input, int length)
{
    if (input == null || input.Length < length)
        return input;
    int iNextSpace = input.LastIndexOf(" ", length, StringComparison.Ordinal);
    return string.Format("{0}…", input.Substring(0, (iNextSpace > 0) ? iNextSpace : length).Trim());
}

В переводе на функции-выражения это будет выглядеть примерно так*.

substring(Input, 1, iif(locate(Input, ' ', 1000) > 0, locate(Input, ' ', 1000) , length(Input)) )

Поскольку у вас нет lastIndexOf в качестве функции-выражения, вам придется по умолчанию использовать locate, что означает, что это выражение обрезает строку до первого пробела после 1000-го символа.

*У меня нет среды, в которой я мог бы проверить это.

person gijswijs    schedule 06.07.2020
comment
Использование regexSplit рассматривает совпадающие регулярные выражения как удаляемые разделители. Поэтому я считаю, что любые дополнительные буквы, совпадающие с \S*, будут потеряны. - person jdaz; 06.07.2020
comment
@gijswijs мы не можем писать код внутри модификатора схемы, производной от столбца, в потоке данных фабрики данных. Единственная возможность - писать регулярные выражения. Я проверил ваше регулярное выражение, но оно у меня не сработало. - person Syam Kumar; 06.07.2020
comment
Единственный вариант похож на regexSplit(text, /.{0,50}\S*(?:\s|$)/m) - person Syam Kumar; 06.07.2020
comment
А как насчет (?<=.{1000})\s? Если Azure применит это итеративно, это будет работать, но если он применит все это сразу к исходной строке, это не сработает. - person jdaz; 06.07.2020
comment
@SyamKumar У вас есть эта перегрузка? документы. microsoft.com/en-us/dotnet/api/ Вы можете использовать startAt int, чтобы указать длину, а затем выполнить поиск первых \s. - person gijswijs; 06.07.2020
comment
Кажется, у вас нет этой перегрузки в Фабрике данных Azure. Поэтому я не думаю, что это можно сделать, но, возможно, стоит попробовать предложения @jdaz. - person gijswijs; 06.07.2020
comment
@syamkumar Обновил мой ответ опцией без регулярного выражения с использованием функций Expression. - person gijswijs; 06.07.2020
comment
@gijswijs Я проверил параметр подстроки. Но мне не повезло - person Syam Kumar; 06.07.2020
comment
Жаль это слышать. Я все еще думаю, что решения должны быть чем-то с подстрокой и поиском. - person gijswijs; 06.07.2020