パターンが変化するレコードから文字列を分離する

このような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

これらの文字列は、 PRIMARY PRACTICE LOC 列の下の単一のセルにあります。今、私はこれらの記録だけからファックス番号を抽出したいです。手動で行うことはたくさんあるので選択肢ではありません。私はSQLの基本を理解しているので、誰かがこれらのレコードからファックス番号だけを抽出して新しい列に入れることができる質問を提案するのを手伝うことができれば私はここで動けなくなり私のプロジェクトを進めることができます。オンラインで検索したところ、SQLの部分文字列関数と分割文字列関数が見つかりましたが、ここでそれらを使用する方法がわかりません。この問題にどのように取り組むかについてのどんなガイダンスも素晴らしいでしょう。

1
Excelには正規表現機能があります。 CSVにエクスポートしてから grep を使用します。しかし、MS SQLにはこれらがありません。パターンマッチングのみで抽出はできません。
追加された 著者 9000,
その情報を自分自身で抽出してからDBにインポートしてはどうでしょうか。
追加された 著者 Ubercool,
次のようにこのような関数を使用することができます。 = RIGHT(A1、LEN(A1) - 4 -SEARCH( "Fax:"、A1))ここで、A1はセルのwthデータです。
追加された 著者 Ubercool,

5 答え

私はあなたがExcelでそれをしてからDBにインポートすることをお勧めします

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,

CHARINDEXを使用して Fax 文字列の開始位置を見つけたら、SUBSTRING関数を使用して文字列から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
追加された

SUBSTRINGPATINDEX および CHARINDEX は、ファックス番号が始まる場所の検索( Fax:パターンの検索)、およびファックス番号の後のスペースの検索を行い、subをコピーします。それらの間の-string。

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文字のコピーを開始します。 2番目のクロス適用は、ファックス番号の後のスペースを見つけます。スペースがない場合、IIF関数は次の20個のシンボルをコピーするようにSUBSTRINGにコピーします。

もちろん、さらに検証を追加することもできます。たとえば、 Fax:というテキストがあります。

IIF(fax.idx = 0, null, SUBSTRING(data.row, fax.idx + 5, IIF(SpaceAfter.idx < 1, 20, SpaceAfter.idx - 1)))
0
追加された

FAXが常に列の最後の値であると仮定して、正しい機能でこれを行うこともできます。

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
追加された

このようなテーブルをフォーマットしたい場合は、このようなタスクには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
追加された