Specifieke tekst uit een string

Status
Niet open voor verdere reacties.

patricw

Gebruiker
Lid geworden
27 mei 2009
Berichten
218
Beste allemaal,

Ik heb onderstaande tekst:

830H240P15NHC_80A1330_25A1320_NBA_AUH-C_PCL2_665

en ik wil graag de tekst tussen de 4e en 5e underscore (in dit geval AUH-C).

Ik heb al zitten denken met substring en charindex maar ik kom er niet uit.

Iemand een suggestie?

groet, Patric
 
Goedemorgen ,

omdat je niet aangeeft welkeprogrammeertaal je wilt gebruiken geef ik je een algemene oplossing.

Schrijf een loop die door de string gaat. (string (0) tot string (laatste of '5')

negeer tekens tot de eerst benodigde _ en begin een nieuwe string.
Voeg daaraan tekens toe tot de sluit _ of einde string.

stop de loop

Klaar
 
Dank voor je reactie, ik werk met SQL (SQL server management studio).

Wat jij zegt klinkt logisch maar daar heb ik geen ervaring mee.

Hoe kun je zoiets doen in SQL?

groet Patric
 
Wat city guy voorstelt lijkt mij een prima benadering! In Excel is dat met vba ook goed te programmeren.
Met de volledige tekst in A1:
- Doorloop de tekst in A1, beginnend bij het eerste teken, tot je de 4e underscore tegenkomt.
- Leg vast het hoeveelste teken het eerstvolgende teken daarna is (= punt a).
- Voer dan vanaf dat punt een vind.spec-opdracht uit (in VBA: 'Search') om te bepalen op welke plaats de volgende (5e) underscore zich bevindt (= punt b).
- De te zoeken tekst is dan: =Deel(A1;a;b-a) ; in vba: Mid(Range("A1"), a, b - a) .
Als je een heleboel van die teksten hebt en je moet steeds hetzelfde gedeelte (tussen 4e en 5 underscore) hebben, dan kun je met een for-nextlus al die teksten snel doorlopen en de resultaten in kolom B laten weergeven.
 
Laatst bewerkt:
Dank voor je reactie, ik werk met SQL (SQL server management studio).

Wat jij zegt klinkt logisch maar daar heb ik geen ervaring mee.

Hoe kun je zoiets doen in SQL?

groet Patric

Ik wil nog een klein stukje verdergaan. (Mijn ervaring echter is alleen MySql en Access) maar ik heb even bij SQL server gekeken

Ik zag dat je met DECLARE variabelen kunt aanmaken en deze kunt gebruiken in SELECT-statements.
Voor de SELECT moet je in de laatste stap on-the-fly een SUBSTR()-aanroep samenstellen. Als jouw substring altijd op dezelfde positie staat is het makkelijk.
Bij een variabele positie moet je de INDEX van '_' #4 en #5 bepalen. (Zet die dan in variabelen)

Ongeveer: (!) trek #4 van #5 af en corrigeer dat zonodig. Dan heb je ook de lengte van jouw substring. Dan heb je alle gegevens om een substring uit jouw string te halen. In een loop kan je dit op alle records in een dataset behandelen.

De oplossing van @zapatr werkt ook maar dan moet je wel VBA-ervaring hebben en met databases en recordsets kunnen werken. En eh, onder ons even, ik heb een hekel aan de nederlandse vertalingen van functienamen binnen Office

Met de zoekterm SQL SERVER stringfunctions kun je via google voorbeelden en technische adviezen vinden.
 
De oplossing van @zapatr werkt ook maar dan moet je wel VBA-ervaring hebben en met databases en recordsets kunnen werken.
VBA-ervaring (althans een beetje kennis van vba): ja, maar kennis van databases en recordsets is niet per se nodig.
Ondertussen is nog altijd niet duidelijk of de vragensteller een reeks van teksten heeft waar wat uitgehaald moet worden of slechts 1 tekst, en ook niet of het dan steeds om het tekstgedeelte tussen de 4e en 5e understroke gaat.
 
VBA-ervaring (althans een beetje kennis van vba): ja, maar kennis van databases en recordsets is niet per se nodig.
Ondertussen is nog altijd niet duidelijk of de vragensteller een reeks van teksten heeft waar wat uitgehaald moet worden of slechts 1 tekst, en ook niet of het dan steeds om het tekstgedeelte tussen de 4e en 5e understroke gaat.

Uit een eerdere post meldt hij te werken met SQL-server. Dan is mijn gedachte dat er gegevens uit een database getrokken worden :rolleyes: Zonder dat heb je gelijk
 
Allebei bedankt voor de input.

Het stukje tekst in de string staat altijd tussen de 4e en 5e underscore, maar kan wel variëren in aantal characters. Tevens zijn de 1e drie characters na de 5e underscore altijd hetzelfde (PCL).
 
Met de tekst die je in bericht #1 plaatste in A1 van "Blad1" (van een Excelbestand) en de methode die ik beschreef in bericht #5, verschijnt na uitvoeren van onderstaande macro het gewenste resultaat in B1. Het aantal tekens tussen de 4e en 5e underscore heeft geen belang. Heb je meerdere teksten (in A2 en volgende rijen) dan maak je in de macro A1 en B1 variabel en plaats je rondom de loop een for-nextlus.
Code:
Sub macro1()
Dim a As Integer, b As Integer, x As Integer
a = 0: x = 1
With Sheets("Blad1")
Do Until a = 4
mystr = Mid(.Range("A1"), x, 1)
If mystr = "_" Then a = a + 1
If a = 4 Then
a = x + 1
b = WorksheetFunction.Search("_", .Range("A1"), a)
.Range("B1") = Mid(.Range("A1"), a, b - a)
Exit Sub
End If
x = x + 1
Loop
End With
End Sub
 
Probeer in SQL loops te vermijden als het kan. Ik vermoed dat je een select hebt waar je een berekende waarde wil teruggeven. Via een combinatie van de functies charindex / substring / zou je er moeten raken. Maar de expressie kan nogal ingewikkeld worden.
Bijvoorbeeld om de tekst tussen de 2de en derde _ te krijgen (opletten op mijn laptop heb ik geen SQL geïnstalleerd dus het voorbeeld is met de losse hand geschreven en moet nog uitgetest en verbeterd worden):


select substring([MyFieldName], charindex('_', [MyFieldName], charindex('_',[MyFielName],1)+1) + 1, charindex('_',(charindex('_', [MyFieldName], charindex('_',[MyFielName],1)+1))

Ik zou hiervoor een scalar functie schrijven, maar test dan ook of de select met de scalar functie niet te traag wordt. Voordeel is dan wel dat je een try/catch kan toevoegen.
 
Laatst bewerkt:
Zoiets was ik aan het zoeken maar dat wordt inderdaad nogal complex. Ik ga het eens testen.

Dank je wel.
 
Zoiets was ik aan het zoeken maar dat wordt inderdaad nogal complex. Ik ga het eens testen.

Dank je wel.


.. misschien heb je er al aan gedacht... Maar toch, probeer de SELECT stapsgewijs op te bouwen en te testen. Dan hou je overzicht en kun je problemen makkelijker onderscheppen.
 
Om het eenvoudiger te maken kan je de volgende functie creëren:
Code:
CREATE FUNCTION [dbo].[fGetStringPart] 
(
	-- Add the parameters for the function here
	@MyText nvarchar(50)
	
)
RETURNS nvarchar(50)
AS
BEGIN
	-- Declare the return variable here
	DECLARE @StringPart nvarchar(50)
	declare @Start int
	declare @Stop int
	-- Add the T-SQL statements to compute the return value here
	if len(@Mytext) > 10 
	begin
		 select @Start = charindex('_',@Mytext, charindex('_', @Mytext,charindex('_' , @Mytext,charindex('_',@MyText,1)+1)+1)+1)
		 select @Stop = charindex('_',@Mytext,charindex('_',@Mytext, charindex('_', @Mytext,charindex('_' , @Mytext,charindex('_',@MyText,1)+1)+1)+1)+1)
	
	
		SELECT @StringPart = substring(@Mytext, @start +1, @stop - @start -1)
	end
	else
		select @stringpart ='ERROR'
	-- Return the result of the function
	RETURN @StringPart

END
GO
 
Om het eenvoudiger te maken kan je de volgende functie creëren:
Code:
CREATE FUNCTION [dbo].[fGetStringPart] 
(
	-- Add the parameters for the function here
	@MyText nvarchar(50)
	
)
RETURNS nvarchar(50)
AS
BEGIN
	-- Declare the return variable here
	DECLARE @StringPart nvarchar(50)
	declare @Start int
	declare @Stop int
	-- Add the T-SQL statements to compute the return value here
	if len(@Mytext) > 10 
	begin
		 select @Start = charindex('_',@Mytext, charindex('_', @Mytext,charindex('_' , @Mytext,charindex('_',@MyText,1)+1)+1)+1)
		 select @Stop = charindex('_',@Mytext,charindex('_',@Mytext, charindex('_', @Mytext,charindex('_' , @Mytext,charindex('_',@MyText,1)+1)+1)+1)+1)
	
	
		SELECT @StringPart = substring(@Mytext, @start +1, @stop - @start -1)
	end
	else
		select @stringpart ='ERROR'
	-- Return the result of the function
	RETURN @StringPart

END
GO

:thumb:
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan