Existe-t-il une façon plus simple de lire un fichier MS Word qu'en utilisant le module Win32::SharedFileOpen?
Merci,
Version imprimable
Existe-t-il une façon plus simple de lire un fichier MS Word qu'en utilisant le module Win32::SharedFileOpen?
Merci,
Le problème est que le fichier n'est pas lu ligne par ligne.
Si je fais
J'obtiens tout le contenu du fichier dans une seule variable $line (contenant des enter) ainsi que d'autres $line contenant des caractères spéciaux, des y avec tréma, des balises NULL, STX.Code:
1
2
3
4
5
6
7
8
9
10
11
12 use Win32::SharedFileOpen qw(:DEFAULT new_fh $ErrStr); ... # Use a lexical indirect filehandle that closes itself when destroyed: my $fh = new_fh(); fsopen($fh, $seq_file, 'r', SH_DENYNO) or die "Can't read : $ErrStr\n"; while (my $line = <$fh>) { print "> $line\n"; }
J'ai essayé un split /\n/ sur le contenu du fichier mais cela ne fonctionne pas non plus.
Avez-vous une idée, merci.
Les fichiers MS Word étant au format binaire, je ne suis pas surpris du résultat obtenu. readline (soit l'opérateur <FH>) ne peut être utilisé à bon escient que sur des fichiers textes, non ?
Merci pour ton intérêt, c'est le module Win32/SharedFileOpen qui décrit cette méthode avec un filehandle.
Mmmmh... readline n'est pas décrit dans la document du module. Je suppose donc qu'elle se comporte comme avec un open standard.
Cela ne change donc pas ma réponse : la lecture ligne à ligne par readline n'est pas adapté aux formats binaires (comme l'est MS Word).
Aurais-je manqué quelque chose ?
Le module File::Binary - Binary file reading module pourrait-il m'aider?
Bah... tout dépend de ton objectif : pourquoi souhaites-tu lire un fichier binaire "ligne à ligne" ?
Tu peux utiliser le module SharedFileOpen et lire ton fichier dans un scalaire, et le traiter ainsi... c'est quoi ton objectif en lisant un fichier MS-Word ? Tu veux trouver le texte à l'intérieur ? Je doute que tu y parviennes, car il te faudrait un parseur MS-Word.
Oui, exactement, je dois récupérer une ligne précise. J'ai réussi avec un open classique et une expression régulière. La variable $line contient toujours l'entièreté du fichier mais l'EXPREG y récupère la ligne voulue.
Juste que ça ne me semble pas très propre mais j'ai vérifier quelques fichiers et les valeurs récupérées sont correctes.Code:
1
2
3
4
5
6
7 open my $fh_seq, '<', $seq_file or die; while (my $line = <$fh_seq>) { if ($line =~ m/Séquence complète\s*\w+\s+(.*?)\s+/){ $seq_tab{$i.'_'.$bact} = $1; } } close $fh_seq;
J'ai recherché sur le CPAN un parser word, mais à première vue, je n'en trouve pas.
Merci d'avoir essayé de m'aider.
Si je comprends bien, tu obtiens ce que tu veux avec un open est une recherche par expression régulière.
Le fait d'utiliser le module Win32::SharedFileOpen ne fait que changer le mode d'accès au fichier, le rendant "partageable" au sens Windows (je suppose que cela implique qu'une fois ouvert en écriture, le fichier est bloqué pour les autres utilisateurs qui ne peuvent l'ouvrir qu'en lecture, ou attendre qu'il soit à nouveau fermé). Cela ne modifie pas en soit la manière dont les données sont lues.
Je ne vois donc pas vraiment où se situe ton problème ? L'usage de <$fh_seq> n'est-il pas possible de la même manière avec Win32::SharedFileOpen qu'avec un open classique ?
Oui, en effet, le module Win32::SharedFileOpen ne modifie pas la lecture des fichiers, il m'est donc inutile.
Le problème est que j'aurais préféré trouver la façon de lire le fichier word ligne par ligne au lieu de récupérer tout son contenu en une fois. Dans ce cas-ci, n'ayant qu'une seule ligne à récupérer, c'est facile mais si j'en avais eu plusieurs, ça aurait posé problème.
Je ne comprends toujours pas ton problème : un binaire n'a pas de "ligne".
Il ne dispose donc pas de séparateur de ligne, et c'est pour cela que le délimiteur par défaut de readline ($/) n'a pas l'effet escompté (\n par défaut).
En revanche, si tu veux lire un fichier binaire par morceaux à l'aide de readline, tu peut redéfinir $/ pour qu'il lise un certain nombre de caractère, par exemple, 1024 :
Ceci est expliqué dans l'aide perlvar :Code:$/ = \1024;
Par contre, en lisant le fichier par morceaux, ne risque tu pas de tronquer la chaine que tu cherches, et ainsi, d'avoir plus de difficulté à la trouver ?Citation:
Setting $/ to a reference to an integer, scalar containing an integer, or scalar that's convertible to an integer will attempt to read records instead of lines, with the maximum record size being the referenced integer.
Je ne connais pas la structure d'un fichier binaire, je ne savais pas que mon document word en faisait partie, je vais me renseigner là dessus, c'est la première chose à faire.
La chaîne est une séquence d'ADN qui est une suite de lettres sans aucun espace.
Merci beaucoup pour ta patience et tes conseils,
Bah... disons que le format utilisé par MS Word est propriétaire... tu ne peux donc pas connaitre la structure du fichier (sauf s'il s'agit de la dernière version du format qui devrait être ouverte).
Si tu connais la taille maximale de ta séquence ADN, tu peux effectuer des lectures par morceaux. Une idée d'algo serait :Citation:
La chaîne est une séquence d'ADN qui est une suite de lettres sans aucun espace.
Code:
1
2
3
4
5
6
7
8
9 $/ = \1024; # on suppose qu'une chaine d'ADN est de taille < 1024 my @buffer = scalar(<$fh_seq>); while (<$fh_seq>) { push @buffer, $_; if ((join "", @buffer) =~ /$ma_sequence/) { ... # Sequence trouvée } shift @buffer; # On vide le début du buffer }
C'est la dernière version des fichiers, je suis la seule à les utiliser, je pourrais les ouvrir sur le PC. A vrai dire, j'ai eu la flemme de copier-coller manuellement mes 34 séquences et j'ai trouvé cela plus élégant d'utiliser un programme ^^ Puis, on ne sait jamais, je pourrais avoir à le refaire plus tard avec d'autres fichiers. En fin ce compte cela m'aura pris dix fois plus de temps avec Perl mais au moins, grâce à toi, j'aurai appris des choses. Je vais regarder ton algorithme merci beaucoup pour ton aide.
Open Office aurait-il posé le même problème? Ou est-ce parce que Word n'est pas libre que ça complique sa lecture?
En fait, je te déconseille de lire un fichier binaire à la recherche d'informations textuelles sans connaitre le format du fichier.
Microsoft a fait évoluer son format depuis la création de son outil Word, et cela la version dans laquelle ton document est enregistré, tu pourras y trouver ou pas les informations que tu cherches. Notamment, il y a peu de chance de trouver quoi que ce soit de textuel dans les dernières versions des formats OpenDocument (supporté par OpenOffice, mais également les toutes dernières versions de Word) et OOXML (le nouveau format de Microsoft), car ce sont des fichiers compressés constitués d'une arborescence de fichiers XML.
Il est donc préférable dans ton, même si c'est laborieux, de récupérer les séquences dans le fichier Word, ou mieux, d'exporter ton document Word au format .txt, qui est un simple fichier texte, que tu pourras lire et interpréter plus facilement.
Non, je pensais fichier par fichier, car comme il n'existe pas de parseur Word en perl, la seule autre solution serait de lancer une macro Windows ouvrant le fichier, et exécutant le menu "save-as" en choisissant un type .txt, mais là, je ne sais pas du tout appeler les API windows depuis perl.
Salut,
Ce serait ptet pas plus mal de recommander aux collègues d'utiliser des formats .txt pour les séquences. Sinon, je n'ai pas testé, mais essaie ça : http://wareseeker.com/free-word2txt/
Hope that helps :)
Oui, mais t'imagine pas à quel point il est difficile de changer leurs bonnes vieilles petites habitudes. ils sont anti-informatiques, c'est dingues! Je leur ai pourtant montré plusieurs softwares tel que Primer3 et BioEdit mais ils continuent de rechercher leurs couples d'amorces et leurs sondes manuellement avec un crayon sur une feuille de papier ... si ils étaient assez doués en math, c'est certains, ils calculeraient leurs Tm mentalement ^^
Merci beaucoup, je vais y regarder. Le problème est résolu, comme je l'ai dit plus haut mais vos conseils pourront toujours servir pour la prochaine fois. Puis il faut aussi que je vérifie si mes séquences ne sont pas tronquées.
Si, si, j'imagine très bien : quand tu vois les pièces à l'INSERM pleines de classeurs de séquences lues à la main alors que franchement 4Peaks ou un soft semblable n'est pas la mer à boire pour s'y familiariser, il te faut des nerfs solides pour ne pas te tirer une balle...
Mais bon, j'ai aussi appris qu'en insistant lourdement, on fait aux gens changer leurs habitudes :mouarf:
:) Y a aussi un pitit script que j'avais trouvé, mais il n'est pas utilisable sous Win32.
Comment feras-tu?