Pour cela, j'ai eut l'idée d'utiliser une Map (uniquement les clé), puisqu'une map empêche de créer deux fois la même.
(Je ne parcours pas tout le fichiers: dès que j'en ai 500 je quitte)
Edit: Version 2 (tri des mots)
Code : Tout sélectionner
; Extraire 500 mots uniques
; Commence et fini par une lettre
; Contient au moins 5 caractères (A à Z majuscules/minuscules, point, signe moins)
Test_File$ = ProgramParameter(0)
If Test_File$ = ""
MessageRequester("Error", "Please provide a filename in compiler parameter")
End
EndIf
If Not OpenFile(hFile, Test_File$)
Debug "Fichier non chargé"
End
EndIf
Debug "Lecture..."
While Not Eof(hFile)
Txt$ = ReadString(hFile, #PB_Ascii | #PB_File_IgnoreEOL)
Wend
CloseFile(hFile)
Debug "Taille: " + FormatNumber(Len(Txt$), hFile) + " caractères"
If CreateRegularExpression(0, "\b([A-Za-z][A-Za-z-.]{3,}[A-Za-z])\b")
Debug "RegEx OK"
Else
Debug "RegEx KO" : End
EndIf
NewMap Words$()
If ExamineRegularExpression(RegEx, Txt$)
While NextRegularExpressionMatch(RegEx)
;i + 1
Tmp_Word$ = RegularExpressionGroup(RegEx, 1)
Words$(Tmp_Word$) = ""; "Word_" + RSet(Str(i), 3, "0")
If MapSize(Words$()) >= 500 : Break : EndIf
Wend
FreeRegularExpression(RegEx)
EndIf
; ShowVariableViewer()
; CallDebugger
; Sort keys
NewList Sorted_Words$()
ForEach Words$()
AddElement(Sorted_Words$())
Sorted_Words$() = MapKey(Words$())
Next
SortList(Sorted_Words$(), #PB_Sort_Ascending)
Words_FileName$ = GetTemporaryDirectory() + "Words.txt"
CreateFile(hFile, Words_FileName$)
ForEach Sorted_Words$()
WriteStringN(hFile, Sorted_Words$())
Next
CloseFile(hFile)
RunProgram(Words_FileName$)
End
J'ai pensé à une base SQLite en mémoire et un SELECT DISTINCT, mais je ne pense pas que soit plus rapide pour 500 mots.