Filtrera text – en nöt att knäcka!

Tråden skapades och har fått 11 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Stockholm
  • 2009-11-24 00:40

Problem är koder för textutseende som ingår i en text som härstammar från resultattabeller (över 40 000 poster) från ett tävlingsspel på Internet.

Texten i ett textfält kan se ut så här: $0cfMladen$999[$ffeVSK$999-$f00CRO$999]$fc6777
Resultatet ska bli det här : Mladen[VSK-CRO]777

Dels finns följande möjliga 2 siffriga $-koder:
$i : italic *

$s : shadowed 
*
$w : wide spacing *

$n : narrow spacing 
*
$m : normal setting 
*
$g : default color *

$t : changes the text to capitals *

$z : reset all *

$$ : to write a "$" *

Sen kommer färgmärkningen som är
$000 till $fff, dvs $ följt av 3st tecken som är hexadecimala.

* = här går det att använda kommandot ”substitute” – men sen återstår problemet med alla variationer av färgkoder som är $ följt av 16x16x16 kombinationer, dvs 4096 kombinationer totalt, tar för långt tid att skapa i substitute och alternativa kommandot ”Replace ( E; $ ; 4 ; "" )” tar bara bort den först hittade färgkoden efter första substitute-filtreringen. (=Mladen$999[$ffeVSK$999-CRO$999]$fc6777)

Utgångspunkt: $0cfMladen$999[$ffeVSK$999-$f00CRO$999]$fc6777

Resultatet ska bli det här : Mladen[VSK-CRO]777

Har provat med "substitut" i kombination med "replace", funkar inte.

Lösningen borde väl bygga på att hitta positionerna på alla $ och sen ta bort den + tre efterföljande tecken….Men hur gör man detta…. ?

2Lazy to find out….

Det finns ett textsträngskommando som heter Position, som i sin tur kan "mata" kommandot Middle osv, som i sin tur kan "mata" kommandot textcolor osv.

Men det tror jag inte på som lösning i det här fallet, men jag har en ide på hur man kan göra det.

Tänk dig att du splittar upp textsträngen i bitar med en smula intelligens, dvs den letar i strängen efter en kod enligt din lista och sedan efter färgkoder enligt din lista.

Sedan splittas grejerna upp i separata fält, för styrkoder och färgkoder, textsträng, styrkoder/färgkoder till, textsträng, fyra styrkoder/färgkoder till, textsträng osv. Kanske så här:

styrkod1
styrkod2
styrkod3
styrkod4
färgkod1
textsträng1
styrkod5
styrkod6
styrkod7
styrkod8
färgkod2
textsträng2

osv....

Manuset fungerar så att det loopar igenom strängen och skär av en bit i taget från vänster och kollar om det är en kod eller färg och är det varken eller så är det text. Sedan tar den nästa bit i den numera kortare strängen.

När du sedan har det, kan du ha villkor baserat på innehållet i fälten för att sedan skapa en sträng som faktiskt innehåller dina färgkoder och styrkoder som finns i Filemaker. Kommandot textformat kan sätta stil och färg och andra kommandon som Upper och Lower kan göra text versal och gemen mm.

När du har lite regler och struktur på dina fält, så är det lättare att göra beräkningen som anger stilen på texten. Färgkoden står i fältet för färgkod och 1-3 varianter på stil står i fälten för stil. Kvar är texten som skall ha den formateringen. När du har gjort detta för första textsträngen som hittas, så är det bara att upprepa det hela 2-5 gånger och du har återskapat exakta utseendet på texten som den såg ut på internetsiten.

Avslutningsvis när du har det där kan du med en annan funktion i Filemaker (heter något med CSS) konvertera den formaterade texten direkt till HTML. Klart att exportera.

  • Medlem
  • Stockholm
  • 2009-11-24 01:42

Kanske ett litet missförstånd

Tack TAZ - för att du tar dig tid...

Ett förtydligande - Jag vill rensa bort alla $-koder i fältet (namnfältet) på de importerade posterna - så att namnen blir läsbara och sökbara i FM.

De behöver inte synas i färg i FM och ska inte publiceras på nätet. (åt det hållet skulle det vara mycket lättare att skapa en lösning- tror jag.)

På nätet däremot syns namnen i färg och är optiskt läsbara - tusentals olika namn och lika många varianter av färgkombinationer som förekommer på olika platser, för respektive namn. (jag tror spelet har över 300 000 medlemmar och lika många färgvarianter...)

Parantes...
Genom över tvåtusen .csv-filer med resultat så har jag lyckats att "scripta" in dem i FM (Över 40 000 poster), det gick ganska fort att skriva scriptet, men sen gäller det att få bort dessa förbaskade färkoder som består $-tecken följt av 3 hexadecimala siffror (0-f).

2Lazy

Du kan använda TextWrangler (gratis) för att blixtsnabbt ta bort färgkoderna i alla två tusen filerna samtidigt.

Gör något av följande:

1. Öppna ett nytt fönster i TextWrangler. Dra och släpp alla 2000 filerna på det tomma fönstret. Tryck cmd-F och skriv \$[0-9abcdef]{3} i find-fältet, inget i replacefältet. Kryssa för "Grep" och klicka på ersätt alla. Detta tar bort alla färgkoder och du får en enda fil med alla 40000 poster.

2. I TextWrangler, tryck shift-cmd f (multi-file find) och välj att du vill söka i de tvåtusen filerna (du behöver inte öppna dem, tryck på "other..." om de inte syns i listan). Använd samma söksträng som ovan. Detta tar bort färgkoderna men behåller posterna i de 2000 ursprungliga filerna.

Formatkoderna kan ersättas på liknande sätt, men jag såg ingen sådan i ditt exempel.

Senast redigerat 2009-11-24 11:03
  • Medlem
  • Stockholm
  • 2009-11-25 00:56

A-F finns ju även i namnet

Ursprungligen av M. Sundbom:

Du kan använda TextWrangler (gratis) för att blixtsnabbt ta bort färgkoderna i alla två tusen filerna samtidigt.

Gör något av följande:

1. Öppna ett nytt fönster i TextWrangler. Dra och släpp alla 2000 filerna på det tomma fönstret. Tryck cmd-F och skriv \$[0-9abcdef]{3} i find-fältet, inget i replacefältet. Kryssa för "Grep" och klicka på ersätt alla. Detta tar bort alla färgkoder och du får en enda fil med alla 40000 poster.

2. I TextWrangler, tryck shift-cmd f (multi-file find) och välj att du vill söka i de tvåtusen filerna (du behöver inte öppna dem, tryck på "other..." om de inte syns i listan). Använd samma söksträng som ovan. Detta tar bort färgkoderna men behåller posterna i de 2000 ursprungliga filerna.

Formatkoderna kan ersättas på liknande sätt, men jag såg ingen sådan i ditt exempel.

D
Är inte alla A-F borta i namnet för gott med denna lösning....

Ursprungligen av 2Lazy:

D
Är inte alla A-F borta i namnet för gott med denna lösning....

Nej då, bara de som ingår i en tresiffrig {3} hexadecimal [0-9abcdef] grupp som följer ett dollartecken \$. Jag testade med ditt exempel innan jag postade tipset. Fungerade bra.

Jag tänkte också på att Grep borde kunna användas, men som sagt, jag uppfattade att förutsättningen var att behålla färgerna på något vis, men även få fram texten. Tycker att M. Sundbom lösning verkar fiffig, men den verkar bara ta bort färgkoderna och inte formatkoderna. Noterade också att du inte hade med dessa i ditt exempel.

Skall alla koder bort är det betydligt enklare, man skapar ett manus som loopar igenom poster.

I varje post skapar man en loop till gör koll om något finns kvar att ersätta, sedan görs en substitute om och om igen, tills dess inga ersättningar finns kvar.

Loop startar
Kolla först om det är styrkoder kvar, dessa börjar med $, men man vill inte hitta sekvensen $$ för det skall betyda $ och skall då vara kvar.
if (patterncount osv, leta efter $-tecken i fältet > 0 och det inte är patterncount $$=1)

Peta in fältet i en variabel.
Sätt en variabel som är noll variabeln_ersättningar_gjorda = 0
# Kolla vilka styrkoder det är:
if (patterncount "$i" )
subtitute ($1 till ""), peta in det i variabeln igen.
variabeln_ersättningar_gjorda + 1

else if (patterncount "$s")
subtitute ("$s" till ""), peta in det i variabeln igen.
variabeln_ersättningar_gjorda + 1

... här kommer en radda till med else if-satser för de övriga styrkoderna.

avslutar sökning efter $ i fältet
end if

exit loop if variabeln_ersättningar_gjorda = 0

end loop

Om det nu finns dollartecken kvar i fältet, så är det färgkoder som är kvar. Då använder man textfunktionerna position och middle för att ta bort färgkoden (dollartecken + tre tecken) där man hittar den. Detta är också en loop tills man inte hittar flera koder att ersätta.

Ungefär så...

Om jag fortsätter på grep-spåret (de söksträngar jag anger funkar i TextWrangler, grep-syntax kan variera så det är inte säkert att de funkar i t.ex. terminalens grep)...

För att ta bort ev formatkoder:
Sök efter \$[gimnstwz]
Ersätt med inget

För att ta behålla ev dollartecken i texten:
Sök efter \$\$
Ersätt med $

Det spelar ingen roll i vilken ordning du gör dessa tre sök-och-ersättningar eftersom de inte överlappar på något sätt.

Om du har tillgång till FileMaker Pro Advanced hade jag gjort en egen funktion:

mvFilter (s) =

Let(
[x = Position(s;"$";1;1)];
If (x;Left(s;x-1) & mvFilter(Middle(s;x+4;99999));s)
)

Funktionen kontrollerar om $ finns i strängen och returnerar i så fall det som finns till vänster om $-tecknet samt anropar sig själv med resterande sträng förutom de 4 första tecknen.

Verkar fungera. Men som sagt, kräver FileMaker Pro Advanced.

  • Medlem
  • Stockholm
  • 2009-11-25 00:49

Så här blev min lösning - slautade vara lat

Av 51237 poster sorteras alla $xxx-förekomster ut = 17498

Skriptet förklarar allt:

/ 2Lazy - men inte denna gång

STOP: Kommandot "Gå till nästa post" ska flyttas ner till efter "Exit loop" i den yttre loopen, slarvfel av mig....

Senast redigerat 2009-11-25 04:03
  • Medlem
  • Stockholm
  • 2009-11-25 09:13

Den här lösningen är spännanade

Ursprungligen av Rolf Clausen:

Om du har tillgång till FileMaker Pro Advanced hade jag gjort en egen funktion:

mvFilter (s) =

Let(
[x = Position(s;"$";1;1)];
If (x;Left(s;x-1) & mvFilter(Middle(s;x+4;99999));s)
)

Funktionen kontrollerar om $ finns i strängen och returnerar i så fall det som finns till vänster om $-tecknet samt anropar sig själv med resterande sträng förutom de 4 första tecknen.

Verkar fungera. Men som sagt, kräver FileMaker Pro Advanced.

Hur många sidor har ett mynt? - Minst tre.

Den här lösningen är spännande, den måste jag prova. Ett helt nytt sätt att tänka.
Funkar det på alla varianter tror jag att det är den som fungerar snabbast....

Tack / 2Lazy

  • Medlem
  • Stockholm
  • 2009-11-25 11:03

Detta är den bästa lösningen för alla med FM pro advanced - tusen tack Rolf Clausen,

1
Bevaka tråden