J'obtenu le fichier .stl suivant, que je voudrais analyser et extraire les coordonnées:Comment analyser le fichier .stl en Java avec les meilleures performances?
solid WEMtoSTL_0
facet normal 0.999309 0.0262812 0.0262796
outer loop
vertex -49.9111 85.733 -1357.76
vertex -49.9346 86.6265 -1357.76
vertex -49.9346 85.733 -1356.86
endloop
endfacet
facet normal 0.999158 0.0290085 0.0290067
outer loop
vertex -49.9346 85.733 -1356.86
vertex -49.9346 86.6265 -1357.76
vertex -49.9633 86.6745 -1356.82
endloop
endfacet
facet normal 0.996327 0.0262471 0.0815064
outer loop
vertex -49.9346 85.733 -1356.86
vertex -49.9633 86.6745 -1356.82
vertex -50.0151 85.733 -1355.88
endloop
endfacet
endsolid WEMtoSTL_0
Les facet
et endfacet
balises peuvent être répétées autant que nécessaire.
C'est ce que j'ai essayé:
Scanner face_scanner = new Scanner(file);
face_scanner.useDelimiter("solid | facet normal | outer loop | vertex | endloop | endfacet");
Mais face_scanner.next()
ne se traduit pas par la suite que je veux:
0.999309 0.0262812 0.0262796
-49.9111 85.733 -1357.76
-49.9346 86.6265 -1357.76
-49.9346 85.733 -1356.86
and so on...
Edit: Je essayé maintenant ce qui suit:
Scanner face_scanner = new Scanner(file);
face_scanner.useLocale(Locale.US);
face_scanner.useDelimiter("\\s|\n");
while (face_scanner.hasNext()) {
if (face_scanner.hasNextFloat()) {
float curr = face_scanner.nextFloat();
} else {
String s = face_scanner.next();
}
}
Pour mon exemple de fichier avec 22402 lignes, cela prend plus de 2 m inutes. Est-il possible de le faire en quelques secondes ou même moins? 2 minutes c'est beaucoup trop pour moi.
Indice: vous pouvez utiliser la fonction 'split' de la classe String à la place. – CKing
Les performances de' split' sont-elles meilleures que celles de 'Scanner'? Parce que j'ai besoin de bonnes performances grâce aux gros fichiers jusqu'à 15Mo. – Flupp
À l'heure actuelle, vous utilisez un scanner pour analyser le fichier comme si vous ne savez pas à quoi il ressemble. "Est-ce un flotteur? Puis lisez un flotteur". Mais vous avez un format de données très spécifique. Par exemple, si une ligne commence par 'vertex', alors vous savez qu'elle sera suivie de trois nombres à virgule flottante. Utilisez cette connaissance pour créer un analyseur beaucoup plus déterministe; J'utiliserais simplement BufferedReader pour parcourir le fichier ligne par ligne moi-même et cela a toujours bien fonctionné pour moi, y compris l'analyse des fichiers dans les gigaoctets. – Gimby