slicing en opnieuw samenvoegen

Coda.io | SwitchIf & Slice

Christiaan Huizer
6 min readApr 1, 2020

--

Dit artikel veronderstelt dat je de basis van Coda onder de knie hebt.

Ik kwam een lijst tegen waarbij namen en cijfers aan elkaar geplakt waren. Gelukkig plakten de cijfers op dezelfde manier aan de namen. Hieronder mijn aanpak. Voor de eenvoud heb ik de lange lijst verkort naar namen met één getal, met twee getallen en met drie getallen.

Eerst zocht ik een manier om tekst in stukjes te knippen. Dat kan via Slice (). De logica van deze formule is de volgende:

Slice(Value,Start,End)

In ons voorbeeld bevindt de ‘Value’ zich in Column 1 en dat maakt dat we een bewerking loslaten op alle rijen in deze kolom.

De basis is dan :

thisRow.[Column 1].Slice(start,end)

Via de puntjes verbinden we de instructies: ‘deze rij’ . ‘van deze kolom’.te ‘bewerken door Slice’. Een eenvoudige oplossing voor 1Arthur is het mes achter de één te zetten. Om het getal één te verkrijgen kiezen we voor (Slice 1,1). Daarmee zeggen we, begin bij het eerste teken en eindig bij het eerste teken. Wil je hetzelfde voor de 22Noah doen? Begin dan bij het eerste teken en eindig bij het tweede teken. De uitdaging is om Coda te vertellen wanneer en waar het mes gezet dient te worden om een plakje van de tekst af te snijden zodat de naam overblijft. We dienen Coda dus te vertellen waar het nummer stopt en de letters beginnen.

IsNumber()

Gelukkig bestaat er een formule of je kan nagaan of een tekst een nummer is. Indien de tekst een nummer is, dan is de uitkomst True() anders False(). De handigheid bestaat er dus uit om na te gaan of we te maken hebben met een nummer en zo ja, kunnen we dan alles behalve het nummer behouden?

Terzijde, voordat ik de IsNumber() gevonden had, was ik begonnen met :

StartsWith( , )

Dat lukt ook, maar is nogal omslachtig en verwarrend. Je moet dan immers vragen, begint de reeks met 0, met 1, met 2 en dat tot 9. Hoewel de formule werkte als voorwaarde voor een ‘slice’ genereert ze door haar lengte makkelijk fouten. Zouden we ook te maken hebben gehad met andere tekens dan getallen, dan zouden we andersom begonnen zijn, te weten met isText()

We richten ons nu op de getallen en ik bedacht onderstaande. Dit is een combinatie van een Ifje , Slice en isNumber() en zo kon ik 1Arthur omzetten naar Arthur, maar 22Noah werd 2Noah en 333Adam werd 33Adam. Voor meer uitleg over Ifjes verwijs ik je naar een eerdere blogpost.

Dit ifje vraagt het volgde. Snij het eerste teken af, check of het een nummer is en als dat zo is neem dan van de tekst teken twee tot teken 99 (om zeker te zijn dat alle tekst er in past), is het geen getal, dan de tekst nemen zoals ze er staat.

Echter met één Ifje ben je er niet. Dit Ifje werkt voor het eerste getal. Je hebt dus nog een Ifje nodig. Het makkelijkste is een nieuwe kolom te openen en daarin de gemaakte formule toe passen op het vorige resultaat. Arthur zal Arthur blijven, 2Noah wordt Noah en 33Adam wordt 3Adam. En dan nog een keer. Zo heb je in drie stappen en met drie kolommen een werkbaar resultaat. En met dat je twee kolommen kan verbergen, kan dit toch elegant gepresenteerd worden zonder dat het echt slim is (sjoemel slim is het).

Oplossing in drie stappen

Ik vond dat het ook in één stap moest kunnen en begon de Ifjes aan elkaar te knopen, maar het lukte me niet direct. Het Ifje opbouwen ging zeer snel en daarna stokte het, ik had niet direct door wat ik verkeerd deed en besloot er een nachtje over te slapen. En dat werkte. Dit is de uitkomst met een Ifje:

De oplossing bestond er in om eerst te denken vanaf het derde getal, dan het tweede getal en dan het eerste getal uitgaande van Number()=True(). Echter dit is dan wel een oplossing binnen één formule, met dat er drie haakjes aan het einde staan, is een foutje zo gemaakt en voelt de oplossing niet ‘proper’ aan.

SwitchIf

In de blog over Ifjes schreef ik dat mocht ik een voorbeeld tegenkomen waarbij een SwitchIf behulpzaam zou zijn, dan zou ik het tonen. Dat moment is nu gekomen. In deze context de Switch handiger dan een normaal Ifje en dat komt doordat de logische structuur van een SwitchIf net iets anders is:

SwitchIf(condition, ifTrue, arg)

De werkende formule is een variant op de Ifjes, we beginnen ook bij het laatst mogelijke getal in deze reeks (in dit voorbeeld zijn er drie getallen) . Waar je bij genestelde Ifjes het volgende Ifje zet waar je anders het alternatief zou zetten, begin je hier na de tweede komma met de volgende voorwaarde om te checken en na de vierde komma, de derde voorwaarde. En zo kun je vlot verder werken mochten de getallen groot worden, dus met bijvoorbeeld 6 nummers. Je hebt ook geen gedoe met haakjes, één aan het begin en één aan het einde. Overigens eindig je net als bij een gewoon Ifje altijd met het alternatief. Dat kan of wel , ‘ ’) zijn of zoals hieronder de gewone waarde uit eerste kolom.

SwitchIf ter vervanging van een nested IF

en dan voor de liefhebbers de code:

SwitchIf(thisRow.[Column 1].Slice(3,3).IsNumber()=True(),thisRow.[Column 1].Slice(4,99),thisRow.[Column 1].Slice(2,2).IsNumber()=True(),thisRow.[Column 1] .Slice(3,99),thisRow.[Column 1].Slice(1,1).IsNumber()=True(),thisRow.[Column 1].Slice(2,99),thisRow.[Column 1])

Hiermee zijn we aan het einde van deze blog gekomen. We bespraken de logica van een Slice(), het belang van nummerherkenning via IsNumber() en hoe je via een If logica voor dit probleem de oplossing kan vinden door bij IsNumber()=True() bij de hoogste waarde te beginnen. Tot slot, hoe SwitchIf de best te onderhouden oplossing is voor dit probleem.

Het was voor mij ook even zoeken. Zou ik de oefening nog eens maken, dan zou ik gebruik maken van IsText() ipv IsNumber(), want je bent op zoek naar tekst. Inzicht toont zich vaak pas achteraf. Ik heb er veel van geleerd en dat terwijl ik eigenlijk bezig was met een blog over FormulaMap. Die heb je dus nog tegoed.

Mijn naam is Christiaan Huizer en ik ben eigenaar van Huizer Automatisatie. In mijn rol als bedrijfsadviseur ben ik vooral actief in het midden en klein bedrijf in Wallonië, Brussel, Vlaanderen en Nederland. Mijn klanten vragen me vooral om hun bedrijf voordelig te vereenvoudigen en versnellen. Ik maak daarbij gebruik van tools als AirTable, Coda, Zapier, MailJet en TypeForm.

Huizer Automatisatie over het gebruik van SwitchIf binnen Coda

--

--

Christiaan Huizer
Christiaan Huizer

Written by Christiaan Huizer

I write about how to Coda . You find blogs for beginners and experienced makers. I publish about 1 / week. Welcome!

No responses yet