J'ai windows 7 pro
Très bien, j'ai apporter quelques corrections afin de fiabilisé des opérations, merci de mettre à jour votre code.
Vous pouvez aussi lancer une fenêtre 'Windows PowerShell' ('démarrer' -> 'recherche les programmes et fichi...' -> taper power -> vous trouverez 'Windows PowerShell')
Après il faut donner les chemin complet du script Powershell. Exemple chez moi : F:\DC\script.ps1
Cela permettra de voir les erreurs car la fenêtre restera ouverte.
Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 $maj = "A-ZÀÁÂÈÉÊËÌÍÎÏÒÓÔÕÖØÙÚÛÜÇÑ" $min = "a-zàáâãäåèéêëìíîïòóôõöøùúûüÿçñ" $trimcar = ",", " ", "-" $separator = ";" $dossier = (Get-Item $PSCommandPath).DirectoryName $csvstr = "Fichier${separator}Nom${separator}Prenom${separator}Date décès${separator}Fils/fille${separator}Epoux/Epouse/Veuve/Veuf/Divorcé`n" foreach ($file in (Get-Item -Path "${dossier}\*.txt")) #*.txt)) { $nom = "" $prenom = "" $datedeces = "" $filsoufillede = "" $epouxépouseveuveveuf = "" $content = Get-Content -Path $file.FullName $content = $content -replace ' - ', '. ' $content = $content -replace '\s+', ' ' $nom = $content[0].Trim() $content = $content -join "" $contenttmp = $content.Substring($content.IndexOf($nom) + $nom.Length) if ($nom.Length -ne 0 -and $contenttmp -cmatch "((\b[$maj]+\w*[\s,]+)*$nom)") { $prenom = $matches[0].Replace($nom, "").Trim($trimcar) } if ($content -match " (fille|fils|file)[^\.,]*") { $filsoufillede = $matches[0].Trim($trimcar) } if ($content -match "\s(Le.*)est décédé") { $datedeces = $matches[1].Trim($trimcar) } if ($content -match " (Fils de|Fille de)[^\.,]*") { $filsoufillede = $matches[0].Trim($trimcar) } if ($content -match "(Epoux de|epouse de|veuve de|veuf de|Divorcée de|Divorcé de)[^\.,]*") { $epouxépouseveuveveuf = $matches[0].Trim($trimcar) } $csvstr += $file.Name + ${separator} + $nom + ${separator} + $prenom + ${separator} + $datedeces + ${separator} + $filsoufillede + ${separator} + $epouxépouseveuveveuf + "`n" } Set-Content -Path "${dossier}\export.csv" -Force -Value $csvstr
Voici ce que j'ai:
Le dossier se nomme script est il est a la racine de C:\
le terme script.ps1 n'est pas reconnu comme nom d'applet etc....
CategoryInfo: Objectnotfound: <script.ps1:String> commandnofoundexception
FullyQualifiedErrorId: CommandFoundException
Suggestion 3 General: la commande script.ps1 est introuvable mais elle existe a l'emplacement actif. par defaut PowerShell de ne charge pas de commande à partir de l'emplacement actif. Si vous approuvez cette commande, tapez ".\script.ps1" à la place
je viens de relancer le script et cela fonctionne. Export vers les csv. Je ragrde tout cela et je vous tiens au courant
JB
Vous etes absolument fantastique !! Cela fonctionne a merveille. Il faut simplement que je reprenne ceux qui sont mal OCR. Dans la date de deces il est mentionné egalement la date de deces dans le fichier csv. Pensez-vous qu'il soit possible de limiter la date uniquement et par consequent de ne pas importer le texte à partir du "à" ?
JB
Vous ne souhaitez que l'heure pour la date de décès ?
Bonjour,
En fait je ne souhaiterai avoir que la date. J'ai regardé votre code et j avoue qu ' est encore nebuleux pour moi
Je voulais essayer aussi d'extraire la date de naissance quand elle est dispo.
Mais tout ce que vous avez deja fait est extraordinaire. Merci encore.
JB
Voici une maj qui pourra vous satisfaire.
Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 $maj = "A-ZÀÁÂÈÉÊËÌÍÎÏÒÓÔÕÖØÙÚÛÜÇÑ" $min = "a-zàáâãäåèéêëìíîïòóôõöøùúûüÿçñ" $trimcar = ",", " ", "-", "." $separator = ";" $dossier = (Get-Item $PSCommandPath).DirectoryName $csvstr = "Fichier${separator}Nom${separator}Prenom${separator}Date décès${separator}Heure décès${separator}Naissance${separator}Fils/fille${separator}Epoux/Epouse/Veuve/Veuf/Divorcé`n" foreach ($file in (Get-Item -Path "${dossier}\*.txt")) #*.txt)) { $nom = "" $prenom = "" $datedeces = "" $heuredeces = "" $naissance = "" $filsoufillede = "" $epouxépouseveuveveuf = "" $content = Get-Content -Path $file.FullName $content = $content -replace ' - ', '. ' $content = $content -replace '\s+', ' ' $nom = $content[0].Trim($trimcar) $content = $content -join "" $contenttmp = $content.Substring($content.IndexOf($nom) + $nom.Length) if ($nom.Length -ne 0 -and $contenttmp -cmatch "((\b[$maj]+\w*[\s,]+)*$nom)") { $prenom = $matches[0].Replace($nom, "").Trim($trimcar) } if ($content -match " (fille|fils|file)[^\.,]*") { $filsoufillede = $matches[0].Trim($trimcar) } if ($content -match "\s(Le.*)est décédé") { $datedeces = $matches[1].Trim($trimcar) if ($datedeces -match "(.*)à([^à]+)") { $datedeces = $matches[1].Trim($trimcar) $heuredeces = $matches[2].Trim($trimcar) } } if ($content -match "\b(né |née )[^\.,]*") { $naissance = $matches[0].Trim($trimcar) } if ($content -match " (Fils de|Fille de)[^\.,]*") { $filsoufillede = $matches[0].Trim($trimcar) } if ($content -match "(Epoux de|epouse de|veuve de|veuf de|Divorcée de|Divorcé de)[^\.,]*") { $epouxépouseveuveveuf = $matches[0].Trim($trimcar) } $csvstr += $file.Name + ${separator} + $nom + ${separator} + $prenom + ${separator} + $datedeces + ${separator} + $heuredeces + ${separator} + $naissance + ${separator} + $filsoufillede + ${separator} + $epouxépouseveuveveuf + "`n" } Set-Content -Path "${dossier}\export.csv" -Force -Value $csvstr
Bonjour,
Merci énormément pour tout. Je vous suis très reconnaissant de tout ce que vous avez fait.
JB
Bonjour,
En exécutant le script je vois que parfois dans l'extraction de la date de décès, il peut être inscrit "Le" ou "L e". Idem pour le lieu ou l'on peut avoir "à" ou "a".
Est ce qu'il est possible de rajouter des conditions dans la ligne de code:
if ($content -match "\s(Le.*)est décédé") et if ($datedeces -match "(.*)à([^à]+)")Tous mes mes essais se sont avérés vains pour le moment.
Merci.
JB
Bonjour,
Je regarde cela dans la journée.
Voici les modifications comme promis
' *' : Espace rencontré 0 ou plusieurs fois
Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part $content -match "\b(L *e.*)est décédé"
'(à|a) ' : 'à' ou 'a' suivi d'un espace (une fois)
Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part $datedeces -match "(.*)(à|a) (.*)"
Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 $maj = "A-ZÀÁÂÈÉÊËÌÍÎÏÒÓÔÕÖØÙÚÛÜÇÑ" $min = "a-zàáâãäåèéêëìíîïòóôõöøùúûüÿçñ" $trimcar = ",", " ", "-", "." $separator = ";" $dossier = (Get-Item $PSCommandPath).DirectoryName $csvstr = "Fichier${separator}Nom${separator}Prenom${separator}Date décès${separator}Heure décès${separator}Naissance${separator}Fils/fille${separator}Epoux/Epouse/Veuve/Veuf/Divorcé`n" foreach ($file in (Get-Item -Path "${dossier}\*.txt")) #*.txt)) { $nom = "" $prenom = "" $datedeces = "" $heuredeces = "" $naissance = "" $filsoufillede = "" $epouxépouseveuveveuf = "" $content = Get-Content -Path $file.FullName $content = $content -replace ' - ', '. ' $content = $content -replace '\s+', ' ' $nom = $content[0].Trim($trimcar) $content = $content -join "" $contenttmp = $content.Substring($content.IndexOf($nom) + $nom.Length) if ($nom.Length -ne 0 -and $contenttmp -cmatch "((\b[$maj]+\w*[\s,]+)*$nom)") { $prenom = $matches[0].Replace($nom, "").Trim($trimcar) } if ($content -match " (fille|fils|file)[^\.,]*") { $filsoufillede = $matches[0].Trim($trimcar) } if ($content -match "\b(L *e.*)est décédé") { $datedeces = $matches[1].Trim($trimcar) if ($datedeces -match "(.*)(à|a) (.*)") { $datedeces = $matches[1].Trim($trimcar) $heuredeces = $matches[3].Trim($trimcar) } } if ($content -match "\b(né\s+|née\s+)[^\.,]*") { $naissance = $matches[0].Trim($trimcar) } if ($content -match " (Fils\s+de|Fille\s+de)[^\.,]*") { $filsoufillede = $matches[0].Trim($trimcar) } if ($content -match "(Epoux de|epouse de|veuve de|veuf de|Divorcée de|Divorcé de)[^\.,]*") { $epouxépouseveuveveuf = $matches[0].Trim($trimcar) } $csvstr += $file.Name + ${separator} + $nom + ${separator} + $prenom + ${separator} + $datedeces + ${separator} + $heuredeces + ${separator} + $naissance + ${separator} + $filsoufillede + ${separator} + $epouxépouseveuveveuf + "`n" } Set-Content -Path "${dossier}\export.csv" -Force -Value $csvstr
Merci Merci et Merci !!!
Je vais essayer de travailler le script pour decomposer la cellule naissance en obtenant uniuement le nom de la ville et la date dans deux cellules distinctes.
Vraiment bien powershell
JB
Même si je ne suis pas trop Powershell, c'est tellement plus puissant que le batch ou autre shell
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager