2010-07-28 10 views
3

J'ai récupéré des documents Word à partir d'un disque dur corrompu à l'aide d'un logiciel appelé photorec. Le problème est que les noms des documents ne peuvent pas être récupérés; ils sont tous renommés par une suite de nombres. Il y a plus de 2 000 documents à trier et je me demandais si je pouvais les renommer en utilisant un processus automatisé.Renommer un document Word et enregistrer son nom de fichier avec ses 10 premières lettres

Y at-il un script que je pourrais utiliser pour trouver les 10 premières lettres dans le document et le renommer avec cela? Il devrait être capable de faire face à plusieurs documents ayant les mêmes 10 premières lettres et ainsi de ne pas écrire sur des documents avec le même nom. En outre, il devrait éviter de renommer le document avec des caractères illégaux (tels que '?', '*', '/', Etc.)

J'ai seulement un peu d'expérience avec Python, C, et même moins avec la programmation de bash sous Linux, alors gardez-moi si je ne sais pas exactement ce que je fais si je dois écrire un nouveau script.

Répondre

2

Les documents Word sont stockés dans un format personnalisé qui place un chargement de binaire cruft au début du fichier. La chose la plus simple serait de frapper quelque chose en Python qui cherchait la première ligne commençant par des caractères ASCII. Ici, vous allez:

#!/usr/bin/python 

import glob 
import os 

for file in glob.glob("*.doc"): 
    f = open(file, "rb") 
    new_name = "" 
    chars = 0 

    char = f.read(1) 
    while char != "": 
     if 0 < ord(char) < 128: 
      if ord("a") <= ord(char) <= ord("z") or ord("A") <= ord(char) <= ord("Z") or ord("0") <= ord(char) <= ord("9"): 
       new_name += char 
      else: 
       new_name += "_" 
      chars += 1 
      if chars == 100: 
       new_name = new_name[:20] + ".doc" 
       print "renaming " + file + " to " + new_name 
       f.close() 
       break; 
     else: 
      new_name = "" 
      chars = 0 
     char = f.read(1) 

    if new_name != "": 
     os.rename(file, new_name) 

REMARQUE: si vous voulez glob plusieurs répertoires dont vous aurez besoin de changer la ligne de glob en conséquence. Cela ne tient pas non plus compte du fait que le fichier que vous essayez de renommer existe déjà, donc si vous avez plusieurs documents avec les mêmes premiers caractères, vous devrez gérer cela.

J'ai trouvé le premier morceau de 100 caractères ASCII dans une rangée (si vous cherchez moins que vous finissez par ramasser des mots-clés doc et autres), puis utilisé les 20 premiers pour faire le nouveau nom, en remplaçant tout ce n'est pas az AZ ou 0-9 avec des traits de soulignement pour éviter les problèmes de nom de fichier.

3

Que diriez-vous de VBScript? Voici un croquis:

NomDossier = "C: \ Documents \"

Set fs = CreateObject("Scripting.FileSystemObject") 

Set fldr = fs.GetFolder(Foldername) 

Set ws = CreateObject("Word.Application") 

For Each f In fldr.Files 
    If Left(f.name,2)<>"~$" Then 
     If InStr(f.Type, "Microsoft Word") Then 

     MsgBox f.Name 

     Set doc = ws.Documents.Open(Foldername & f.Name) 
     s = vbNullString 
     i = 1 
     Do While Trim(s) = vbNullString And i <= doc.Paragraphs.Count 
      s = doc.Paragraphs(i) 
      s = CleanString(Left(s, 10)) 
      i = i + 1 
     Loop 

     doc.Close False 

     If s = "" Then s = "NoParas" 
     s1 = s 
     i = 1 
     Do While fs.FileExists(s1) 
      s1 = s & i 
      i = i + 1 
     Loop 

     MsgBox "Name " & Foldername & f.Name & " As " & Foldername & s1 _ 
      & Right(f.Name, InStrRev(f.Name, ".")) 
     '' This uses copy, because it seems safer 

      f.Copy Foldername & s1 & Right(f.Name, InStrRev(f.Name, ".")), False 

      '' MoveFile will copy the file: 
     '' fs.MoveFile Foldername & f.Name, Foldername & s1 _ 
     '' & Right(f.Name, InStrRev(f.Name, ".")) 

     End If 
    End If 
Next 

msgbox "Done" 
ws.Quit 
Set ws = Nothing 
Set fs = Nothing 

Function CleanString(StringToClean) 
''http://msdn.microsoft.com/en-us/library/ms974570.aspx 
Dim objRegEx 
Set objRegEx = CreateObject("VBScript.RegExp") 
objRegEx.IgnoreCase = True 
objRegEx.Global = True 

''Find anything not a-z, 0-9 
objRegEx.Pattern = "[^a-z0-9]" 

CleanString = objRegEx.Replace(StringToClean, "") 
End Function 
+0

Désolé, il m'a fallu si longtemps pour répondre. Comment puis-je exécuter ce script? Est-ce que je l'enregistre en tant que fichier .bat ou quelque chose? – Eddy

+0

.vbs pour vbscript. Il est possible que vbscript ait été désactivé pour des raisons de stratégie: http://technet.microsoft.com/fr-fr/library/ee198684.aspx – Fionnuala