отделить строку от записей с изменяющимися образцами

У меня есть данные в файле Excel, как это. В качестве примера, я публикую здесь только 2 записи в качестве примера, и всего их насчитывается 10000.

1) 8984 Beachwood Rd Wasaga Beach ON L9Z 2X8 Phone: (705) 422-1000 Fax: (705) 422-1006
2)Bronte Health Centre 78 Jones Street Oakville ON L6L 6C5 Phone: (905) 827-9865
Fax: (905) 827-3583

Эти строки находятся в одной ячейке в столбце ПРАКТИЧЕСКИЙ МЕСТО ПРАКТИКИ . Теперь я хочу извлечь номера факсов только из этих записей. Вручную это не вариант, потому что их много. Я понимаю основы SQL, поэтому, если кто-то может помочь мне предложить запрос, который может извлечь из этих записей только номер факса и поместить его в новый столбец, мне будет полезно продолжить работу над моим проектом, поскольку я застрял здесь. Я искал в Интернете и нашел функции SQL для подстрок и splitstring, но понятия не имею, как их использовать здесь. Любое руководство о том, как подойти к этому вопросу было бы здорово.

1
Я полагаю, что В Excel есть возможности регулярных выражений . Я бы просто экспортировал в CSV и затем использовал grep . В MS SQL их нет: только сопоставление с образцом, а не извлечение.
добавлено автор 9000, источник
Почему бы не извлечь эту информацию в Excel и затем импортировать в БД?
добавлено автор Ubercool, источник
Вы можете использовать такую ​​функцию в Excel = RIGHT (A1, LEN (A1) - 4-SEARCH ("Fax:", A1)) , где A1 - ячейка с данными
добавлено автор Ubercool, источник

5 ответы

Я хотел бы предложить вам сделать это в Excel, а затем импортировать в БД (если вам нужно)

just go to Data => Text To Columns Then separate by colon and play a bit with the columns.

Это будет намного быстрее.

enter image description here

1
добавлено
Правильно, так по двоеточию
добавлено автор user1913615, источник
Это может быть проблематично, так как количество пробелов в каждой записи может варьироваться, что приводит к разному количеству столбцов для каждой записи.
добавлено автор Ubercool, источник

Вы можете использовать функцию SUBSTRING, чтобы извлечь номер факса из строки после использования CHARINDEX, чтобы найти место начала строки Fax

Просмотреть демонстрационный ролик

create table yourtable ([PRIMARY PRACTICE LOC] nvarchar(max));
insert into yourtable values
('8984 Beachwood Rd Wasaga Beach ON L9Z 2X8 Phone: (705) 422-1000 Fax: (705) 422-1006'),
('Bronte Health Centre 78 Jones Street Oakville ON L6L 6C5 Phone: (905) 827-9865 Fax: (905) 827-3583');

select 
    Fax=
       SUBSTRING([PRIMARY PRACTICE LOC],CHARINDEX('Fax',[PRIMARY PRACTICE LOC]),LEN([PRIMARY PRACTICE LOC]))
from yourtable
1
добавлено

Вы можете использовать SUBSTRING , PATINDEX и CHARINDEX позволяет определить, где начинается номер факса (т. Е. Найти шаблон Fax: ), найти пробел после номера факса и скопировать подпункт. -струна между ними.

select *, SUBSTRING(data.row, fax.idx + 5, IIF(SpaceAfter.idx < 1, 20, SpaceAfter.idx - 1))
from (values
('8984 Beachwood Rd Wasaga Beach ON L9Z 2X8 Phone: (705) 422-1000 Fax: (705) 422-1006 '),
('Bronte Health Centre 78 Jones Street Oakville ON L6L 6C5 Phone: (905) 827-9865 Fax: (905) 827-3583')) data(row)
cross apply (select PATINDEX('%Fax: %', data.row) as idx) fax
cross apply (select CHARINDEX(' ', data.row, fax.idx + 15) as idx) SpaceAfter

Первое перекрестное применение находит, где Fax: отправляет текст. Мы начнем копировать 5 символов после этого индекса. Второе перекрестное применение находит пробел после номера факса. Если пробела нет, функция IIF скопирует команду SUBSTRING, чтобы скопировать следующие 20 символов.

Конечно, вы можете добавить дополнительные проверки, например, есть ли вообще текст Fax: :

IIF(fax.idx = 0, null, SUBSTRING(data.row, fax.idx + 5, IIF(SpaceAfter.idx < 1, 20, SpaceAfter.idx - 1)))
0
добавлено

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

declare @table table(
[PRIMARY PRACTICE LOC] varchar(max))

insert into @table
values('8984 Beachwood Rd Wasaga Beach ON L9Z 2X8 Phone: (705) 422-1000 Fax: (705) 422-1006'),('Bronte Health Centre 78 Jones Street Oakville ON L6L 6C5 Phone: (905) 827-9865
Fax: (905) 827-3583')

SELECT
RIGHT([PRIMARY PRACTICE LOC],len([PRIMARY PRACTICE LOC])-CHARINDEX('Fax',[PRIMARY PRACTICE LOC])-3) as Fax
from  @table
0
добавлено

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

  1. Wrap the hole string
  2. Detect key words like Phone and Fax , in this phase you should have and array with 3 elements like [8984 Beachwood Rd Wasaga Beach ON L9Z 2X8, Phone: (705) 422-1000,Fax: (705) 422-1006 ]
  3. Then with a python librarie insert in the excel with the desire format

Also i found this link useful https://www.extendoffice.com/documents/excel/3639-excel-extract-part-of-string.html

0
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)