Добрый день. Долго искал формулу, но так и не нашел. Есть csv файл, в нем все данные идут в одном столбце, но разделение идет не через ";", а через "/". Вот пример: РТ-00000137/CAFA FRANCE ОЧКИ ПОЛЯР МУЖСК/КОРИЧН ЛИНЗА/С12931/1 096.6. Мне нужно разделить на три столбца: ариткул, наименование, цена. Так как в наименовании встречаются тоже "/" стандартными функциями у меня не получилось что-что путное сделать. Подскажите как разделить на три столбца?!
Модератор
Вы на всех форумах правилам не будете следовать?
Забанить вас, что ли?
Возможно наименование можно выбрать по количеству знаков. Был бы пример, можно было бы попробовать найти вариант. А коли нет примера, удачи Вам.
Решение:
1. загрузить в столбец A все строки из csv файла: артикул/наименование/цена
2. для каждой строки определить позиции в строке для первого слева знака "/" (в столбец B) и первого справа знака "/" (в столбец C).
Для этого например в ячейку B1 нужно записать формулу =ПОИСК("/";A1)
А в ячейку C1 я бы записал формулу с моей пользовательской функцией ПоискСправа (см. ее текст ниже в решении): =ПоискСправа("/";A1)
Функция ПоискСправа возвращает номер позиции символа справа в строке. Пользуюсь всегда ею, так как пока не нашел ее аналога во встроенных функциях Excel, кто знает способ проще - подскажите. Пользовательскую функцию ПоискСправа нужно будет вставить в текущую книгу Excel на лист макросов (Alt+F11, на своей книге нажать правой кнопкой мыши, Insert - Module)
3. для каждой строки в столбцы D, E, F выделить подстроки артикул, наименование, цена из столбца A, используя стандартные функции Excel и числа из столбцов B и C:
Например для 1 строки: в D1 =ЛЕВСИМВ(A1;B1-1)
в E1 =ПСТР(A1;B1+1;C1-B1-1)
в F1 =ПРАВСИМВ(A1;ДЛСТР(A1)-C1)
Конечно, формулы из столбцов B и C можно сразу вставить в формулы столбцов D, E, F. Я здесь записал их отдельно в столбцы B и C просто для наглядности.
Пример - во вложенном файле.
Public Function ПоискСправа(Poisk As String, BigStr As String) As Long
'возвращает номер позиции символа справа в строке
Dim pos As Long, i As Long, lP As Long, lB As Long
pos = 0
lP = Len(Poisk)
lB = Len(BigStr)
If lP <= lB Then
For i = lB - lP + 1 To 1 Step -1
If Mid(BigStr, i, lP) = Poisk Then
pos = i
Exit For
End If
Next
End If
ПоискСправа = pos
End Function
для оформления кода есть соответствующая кнопка [МОДЕРАТОР]
Можно воспользоваться стандартным инструментом экселя "Текст-по-Столбцам" (меню Данные)
=ЗАМЕНИТЬ(A1;ПОИСК("/";A1);100;"") это B2
=ЗАМЕНИТЬ(A1;1;ПОИСК("/";A1;ПОИСК("/";A1)+1);"")
=ЗАМЕНИТЬ(ЗАМЕНИТЬ(A1;1;ДЛСТР(B2)+1;"");ПОИСК("/";ЗАМЕНИТЬ(A1;1;ДЛСТР(B2)+1;""));100;"")
Цитата: IKor от 13.02.2015, 15:40
Можно воспользоваться стандартным инструментом экселя "Текст-по-Столбцам" (меню Данные)
В том-то здесь и проблема, что для строк вида "РТ-00000137/CAFA FRANCE ОЧКИ ПОЛЯР МУЖСК/КОРИЧН ЛИНЗА/С12931/1 096.6", которые нужно разделить на три столбца: ариткул, наименование и цена, инструмент "Текст-по-Столбцам" создаст в общем случае больше трех столбцов: в приведенном примере строки будет создано 5 столбцов, поле "Наименование" разделится на 3 столбца, хотя его делить по столбцам конечно не надо. В общем случае в строках файла могут оказаться наименования, содержащие 1 или несколько символов "/", или вообще не содержащие этого символа. Именно поэтому приходится аккуратно отделять от исходной строки артикул слева, цену справа, а среднюю часть, наименование, не обрабатывать и не делить по столбцам.
Цитата: zs от 13.02.2015, 21:56
=ЗАМЕНИТЬ(A1;ПОИСК("/";A1);100;"") это B2
=ЗАМЕНИТЬ(A1;1;ПОИСК("/";A1;ПОИСК("/";A1)+1);"")
=ЗАМЕНИТЬ(ЗАМЕНИТЬ(A1;1;ДЛСТР(B2)+1;"");ПОИСК("/";ЗАМЕНИТЬ(A1;1;ДЛСТР(B2)+1;""));100;"")
Если в исходных строках поле "наименование" будет всегда обязательно иметь 2 символа "/", как в исходном примере, то конечно можно использовать приведенные формулы. Однако, обычно в наименованиях товаров символ "/" может встречаться 1 или несколько раз, или вообще не встречаться, а значит такие формулы будут в общем случае делить исходную строку на части неверно.