Страницы: 1 2 След.
RSS
Разбить столбец на несколько при разных разделителях
 
В файле порядка 300 тыс.записей, необходимо разбить столбец  на несколько. Я пользуюсь функциями ПОИСК, ЛЕВСИМВ, ПРАВСИМВ, ПСТР, но проблема в том, что трудно выделить диапазон строк, к которым применить определенную функцию. Может быть у кого-нибудь появятся мысли? Или возможно другое решение?
 
Вот как, например понять, что в тексте , ул.МИРА, д.81 кв.22 пропущены район и регион?
There is no knowledge that is not power
 
Информация была собрана из разных источников, поэтому возможно, что каких-то данных не хватает. В этом и есть вся проблема.
 
У Вас есть ключевой разделитель "Запятая".
1.Выделяете текст.
2.Данные/Текст по столбцам/С разделителями/Далее в ячейке "другой" справа ставите запятую
3. Готово
Так вы разделите город /пункт/ улица

Если проставите запятые в нужном порядке после дома № разложите всю таблицу

Можно немного упростить .расстановку после дома. При условии что следующая фраза начинается с "кв". Выделяете столбец и делаете Заменить "кв" на ", кв".  
«Всё гениальное просто» перефразировка афоризма Леонардо да Винчи
 
добрый вечер,shoa,только прочитал Вашу тему,попробуйте занести в столбцы результата следующие функции,как в файл-примере,
для вытягивания номера дома,номера квартиры ,улицы и населенного пункта
Код
Function yyy2(t$)
With CreateObject("VBScript.RegExp"): .Pattern = "\d+": .Global = True
  If .test(t) Then
      If .Execute(t).Count = 2 Then yyy2 = CInt(.Execute(t)(.Execute(t).Count - 1))
      If .Execute(t).Count = 1 Then yyy2 = ""
  Else: yyy2 = ""
  End If
End With
End Function
Код
Function yyy1(t$)
With CreateObject("VBScript.RegExp"): .Pattern = "\d+": .Global = True
  If .test(t) Then
      If .Execute(t).Count = 2 Then yyy1 = CInt(.Execute(t)(.Execute(t).Count - 2))
      If .Execute(t).Count = 1 Then yyy1 = CInt(.Execute(t)(.Execute(t).Count - 1))
  Else: yyy1 = ""
  End If
End With
End Function
Код
Function zzz$(t$)
   Dim x1, x2, t1$, i%, j%, i1%
  i1 = Len(t) - Len(Replace(t, ",", ""))
  If i1 = 2 Then
       x1 = Split(t, ",")
       t1 = x1(1)
       x2 = Split(t1)
    For i = UBound(x2) To 0 Step -1
      For j = Len(t1) To 1 Step -1
     If Mid(x2(i), j, 1) Like "[А-Я]" Then zzz = x2(i): Exit Function
    Next j, i
 Else: zzz = " "
 End If
End Function
Код
Function zzz2$(t$)
   Dim t1$, i1%
   i1 = Len(t) - Len(Replace(t, ",", ""))
If i1 = 2 Then
     t1 = zzz(t)
    With CreateObject("VBScript.RegExp"): .Pattern = "(.+)(?:" & t1 & ")"
        If .test(t) Then
          t1 = .Execute(t)(0).Submatches(0)
          zzz2 = Left(t1, Len(t1) - 2)
        End If
    End With
 Else: zzz2 = Split(t, ",")(1)
 End If
End Function
 
shoa,добавлю,что,если,текста ул. не надо,используйте в столбце F вариант функции zzz
Код
Function zzz$(t$)
   Dim x1, x2, t1$, i%, j%, i1%
  i1 = Len(t) - Len(Replace(t, ",", ""))
  If i1 = 2 Then
       x1 = Split(t, ",")
       t1 = x1(1)
       x2 = Split(t1)
    For i = UBound(x2) To 0 Step -1
      For j = Len(t1) To 1 Step -1
     If Mid(x2(i), j, 1) Like "[А-Я]" Then zzz = Mid(x2(i), 4): Exit Function
    Next j, i
 Else: zzz = " "
 End If
End Function
 
shoa,если будете использовать вариант #6 ,то используйте такой прикрепленный файл-пример:
 
Цитата
sv2013 написал:
shoa,если будете использовать вариант #6 ,то используйте такой прикрепленный файл-пример:
sv2013 подскажите , как работают эти формулы =zzz  =yyy? По каким критериям они делают отбор? Спасибо.
«Всё гениальное просто» перефразировка афоризма Леонардо да Винчи
 
добрый вечер,Demonic,отвечаю на Ваш вопрос, в #8,функция yyy1 вытягивает  номер дома,а функция yyy2 соответственно номер квартиры,
используются стандартные регулярные выражения,отрабатывается также вариант наличия одного числа или отсутствия чисел.
функция zzz выделяет улицу, ищет первую заглавную русскую букву справа,предварительно отсекая букву А,используя Split с разделителем запятая.
zzz2 также использует регулярные выражения,то есть фактически выделяет все левее улицы, при этом использует результат функции zzz
Можно дополнить соответствующими функциями в приложенном файл-примере создателя темы, легко,- остальные графы: район,регион,строение,тип.
Желательно,чтобы создатель темы опубликовал максимально расширенный файл-пример,например,сжав данные с помощью WinRaR.
..
 
Спасибо, sv2013, все замечательно!
 
всем по привету! помогите решить вопрос с разбиением столбца с текстом на несколько. в файле пример. вариант с "текст по столбцам" не подходит, т.к. есть города с дефисом и отбор по дефису не подходит... в файлике даны
 
А как программа должна понять, что дефис в Санкт-Петербург не учитывать?
Вариант: Ctrl+H и заменить Санкт-Петербург на Санкт_Петербург. Аналогично для других городов с дефисом.
 
так и я о том же... т.е. тут никаких вариантов нет получается для автоматизации процесса?
 
Сверка со списком городов с дефисами
 
Ну почему нет? Сначала сделайте замену, выполните макрос, потом обратную замену. Если есть отдельный список городов с дефисами, то и замену можно автоматизировать.
 
И ладно бы если бы только Санкт-Петербург  к примеру, а если еще Улан-Уде, Ростов-на-Дону и т.д., то тут как быть? ctrl+h не поможет...
 
Цитата
Юрий М написал:
Если есть отдельный список городов с дефисами, то и замену можно автоматизировать.
 
Спасибо! Это идея! А если не трудно, не могли бы Вы привести пример?
 
Пример чего?
 
Уважаемые форумчане! В примере показано как есть и как надо сделать, также есть список городов. Подскажите, пожалуйста, как разбить столбец сверяясь со списком, не совсем понимаю как это сделать...
 
ЛегкийГолод, У   вас можно просто:
выделяете столбец с данными; вкладка "Данные" - "Тест по столбцам" - разделитель "-" (тире) - готово.
и списки не нужны.
Изменено: Михаил Витальевич С. - 08.12.2019 12:49:40
 
Михаил Витальевич С.,
А как быть с Санкт-Петербург и другими аналогичными городами?
 
Kuzmich, да, немного поторопился :(
 
Цитата
Kuzmich написал:
А как быть с Санкт-Петербург и другими аналогичными городами?
Совершенно верно, в этом вся суть, текст по столбцам работает до первого города, дальше, если город с дефисом, не срабатывает правильно...
 
Я думаю надо в списке городов сделать второй столбец, где заменить знак - на знак подчеркивания _
Затем на листе Отчет произвести замену городов с - на города с _
Затем текст по столбцам и обратную замену
 
Да я, в принципе, так и сделал, только это долго. Я думал что можно как то это быстрей сделать.  
 
ЛегкийГолод, смотря каким методом вы это сделали; допустимы ли макросы и немного зависит от количества записей.
 
ЛегкийГолод, Если задача разовая, то сперва немного обрабатываем массивной
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A2;
IFERROR(INDEX(список_городов!A:A;SMALL(IF(ISNUMBER(FIND(список_городов!$A$1:$A$1147;A2));ROW($A$1:$A$1147));1));"");IFERROR(SUBSTITUTE(INDEX(список_городов!A:A;SMALL(IF(ISNUMBER(FIND(список_городов!$A$1:$A$1147;A2));ROW($A$1:$A$1147));1));"-";CHAR(1));""));
IFERROR(INDEX(список_городов!A:A;SMALL(IF(ISNUMBER(FIND(список_городов!$A$1:$A$1147;A2));ROW($A$1:$A$1147));2));"");IFERROR(SUBSTITUTE(INDEX(список_городов!A:A;SMALL(IF(ISNUMBER(FIND(список_городов!$A$1:$A$1147;A2));ROW($A$1:$A$1147));2));"-";CHAR(1));""));"-";",");CHAR(1);"-");",";"-,";4);",";"-,";3)

Копируем как значения, и разбиваем на столбцы разделителем ","  Если в тексте встречается , то меняем на что либо другое, например на char(9) и табуляцию соответственно.
По вопросам из тем форума, личку не читаю.
 
БМВ, Миш, в России, как выяснилось, всего 48 городов с "-"; можно вынести их в отдельный список и массив список_городов!$A$1:$A$1147 в 25 раз.
 
Михаил Витальевич С., записей не больше 3000 строк и допустимо ВСЕ, лишь бы правильно разбить столбец =)
Страницы: 1 2 След.
Наверх