Extraire 500 mots uniques d'un fichier
Publié : sam. 11/avr./2020 10:14
Je cherche à extraire 500 mots uniques d'un fichier.
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)
Question: est-ce une bonne idée ou peut-on faire mieux (plus simple) ?
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.

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.