değişen dizili kayıtlardan bir dize ayırmak

Böyle bir excel dosyasında veri var. Örnek olarak, burada örnek olarak sadece 2 kayıt gönderiyorum ve bunun gibi toplam 10000 kayıt var.

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

Bu dizgiler, PRIMARY PRACTICE LOC sütununun altındaki tek bir hücrede bulunur. Şimdi sadece faks numaralarını bu kayıtlardan çıkarmak istiyorum. El ile yapmak bir seçenek değil çünkü çok fazla. SQL'in temellerini anlıyorum, bu yüzden herhangi biri bana bu kayıtlardan yalnızca faks numarasını çıkarabilen ve yeni bir sütuna koyabilecek bir sorgu önerme konusunda yardımcı olabilir ve burada sıkışıp kaldığım sürece projeme daha fazla devam etmemde yardımcı olacaktır. Çevrimiçi olarak araştırdım ve SQL'in substring ve splitstring işlevlerini buldum ancak bunları burada nasıl kullanabileceğim konusunda hiçbir fikrim yok. Bu konuya nasıl yaklaşılacağına dair herhangi bir rehberlik mükemmel olacaktır.

1
Sanırım Excel'in düzenli ifade yetenekleri vardır . Yalnızca CSV'ye dışa aktarıp sonra grep öğesini kullanırdım. MS SQL'de bunlara sahip değil: yalnızca desen eşleştirmesi, çıkartma işlemi değil.
katma yazar 9000, kaynak
Neden bu bilgiyi kendi içinde çıkarıp DB'ye almıyorsunuz?
katma yazar Ubercool, kaynak
Bunun gibi bir işlevi excel = RIGHT (A1, LEN (A1) - 4 -SEARCH ("Faks:", A1)) dizininde kullanabilirsiniz.
katma yazar Ubercool, kaynak

5 cevap

Excel üzerinde yapmanı ve sonra DB'ye aktarmanızı öneririm (gerekirse)

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

Çok daha hızlı olacak.

enter image description here

1
katma
Doğru, böylece kolon
katma yazar user1913615, kaynak
Her kayıttaki boşluk sayısı değişiklik gösterebileceği için sorunlu olabilir, böylece her kayıt için farklı sütun sayısı ortaya çıkabilir.
katma yazar Ubercool, kaynak

Fax dizesinin başlangıç ​​konumunu bulmak için CHARINDEX'i kullandıktan sonra dizgeden FAKS numarasını çıkarmak için SUBSTRING işlevini kullanabilirsiniz.

Canlı demoya bakın

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
katma

SUBSTRING , PATINDEX ve CHARINDEX , faks numarasının nerede başladığını bulma (örneğin Faks: modelini arama), faks numarasından sonra boşluğu bulma ve alt numarayı kopyalama işlevini yerine getirir. -Onların arasında.

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

İlk çarpı uygulaması, Faks: 'un nerede yazdığını bulur. Bu dizinden sonra 5 karakter kopyalamaya başlayacağız. İkinci çapraz uygulama, faks numarasından sonraki boşluğu bulur. Boşluk yoksa, IIF işlevi, sonraki 20 simgeyi kopyalamak için SUBSTRING'e söyleyecektir.

Elbette, ek doğrulamalar ekleyebilirsiniz; örneğin, Faks: metni var:

IIF(fax.idx = 0, null, SUBSTRING(data.row, fax.idx + 5, IIF(SpaceAfter.idx < 1, 20, SpaceAfter.idx - 1)))
0
katma

Bunu, faksın her zaman sütundaki son değer olduğunu varsayarak doğru işlevle de yapabilirsiniz.

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
katma

Python gibi basit bir programlama lenguaje kullanmanızı öneririm, eğer böyle bir iş için biçimlendirmek istiyorsanız python bu işi yapacak

  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
katma