Разделение текстовых столбцов

64
9

У меня очень большой файл (8 миллионов строк), который я импортировал в PowerPivot с столбцом адреса, который я хочу разделить:

enter image description here

Я попробовал LEFT и FIND, но не смог получить результат, как мне хотелось.

спросил(а) 2021-01-25T16:44:35+03:00 4 месяца, 3 недели назад
1
Решение
100

С данными в A1, в B1 введите:

=TRIM(MID(SUBSTITUTE($A1,"#",REPT(" ",999)),COLUMNS($A:A)*999-998,999))

и копировать.

ответил(а) 2021-01-25T16:44:35+03:00 4 месяца, 3 недели назад
88

Текст в столбцы с # как разделитель может подойти, хотя, возможно, с TRIM для каждой из результирующих ячеек.

ответил(а) 2021-01-25T16:44:35+03:00 4 месяца, 3 недели назад
63

Учитывая, что в настоящее время (версия 2010+) используется команда меню, это может быть сделано с помощью мастера импорта, функция VBA делает это легко, и другие решения были опубликованы, это может показаться ненужным. Тем не менее, здесь используется альтернативный подход с использованием формулы массива.

Вам нужно иметь строку заголовка и заполнять инкрементные целые числа (1, 2, 3,...) в столбцах, где будут отображаться значения с разделителями. Вам нужно столько столбцов, сколько есть разграниченных значений. В этом примере разделителем является "#". Второй разделитель ("@" в примере, но, вероятно, лучше, это что-то вроде CHAR (1)) должен быть выбран для формулы.

Было бы идеально, если бы у Excel была функция Split, например VBA, но это не так.

Было бы удобно, если бы у Excel была функция FIND, которая могла бы найти n-ое появление символа, но это не так.

Однако Excel имеет функцию SUBSTITUTE которая может работать с n-м вхождением символа, а затем вы можете найти этот символ. Таким образом, возможно громоздкое обходное решение.

=FIND("@",SUBSTITUTE($A2,"#","@",5))

будет оценивать позицию символа в строке в $ A2, в которой происходит пятое вхождение разделителя "#".

Например

$A2 = "Hello#my#name#is#Bob#What#is#your#name?" 

SUBSTITUTE($A2,"#","@",5) = "Hello#my#name#is#Bob@What#is#your#name?"

FIND("@",SUBSTITUTE($A2,"#","@",5)) = 21

Чтобы заставить его работать в более общем плане, поместите строку с разделителем на обоих концах и используйте функцию MID чтобы изолировать часть текста, который вы хотите. Используйте строку заголовка столбца (например, B $ 1: M $ 1), чтобы указать, какое разделительное значение появится в этом столбце.

=MID($A2, FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B$1)), FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B$1+1)) - FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B$1)) - 1 )

Вы можете скопировать эту формулу по ссылке или вы можете сначала выделить по столбцам, а затем ввести формулу с диапазоном массива заголовков вместо B $ 1 (например, B $ 1: F $ 1) и сохранить ее как формулу массива с помощью CTRL + SHIFT + ENTER.

Например,

{=MID($A2, FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B$1:F$1)), FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B$1:F$1+1)) - FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B$1:F$1)) - 1 )}

была бы формулой массива для B2: F2 для разделения A2 на 5 отдельных значений # -delimited, считая, что B1: F1 содержит 1, 2, 3, 4, 5 по ячейкам.

Используйте FIND not SEARCH потому что SEARCH не чувствителен к регистру и использует подстановочные знаки (*,?).

ответил(а) 2021-01-25T16:44:35+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема