Question Comparaison de chaines de caractères (Résolu)

Plus d'informations
il y a 16 ans 5 mois #1027 par pgu
Réponse de pgu sur le sujet Re:Comparaison de chaine de caratères
Merci beaucoup pour toutes ces explications.

Pour le script, la solution que tu me proposes compare des chaines.
Donc si dans mon fichier je n'ai qu'une ligne de 4 coches (le caractère \"X\"), et que ma reférence contient sur une seule ligne aussi mais avec 4 \"0\" , le script doit me retourner 4 (pour 4 coches en erreur) et non (1 pour 1 question en erreur).

Le test sur les chaines de caractères que j'ai fait dans mon script est uniquement pour ne lancer l'analyse par caractère que dans le cas d'erreur<br><br>Message édité par: Patrice33, à: 1/10/07 13:49

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 5 mois #1028 par Jacques Barathon
Ok, dans ce cas-là il faut utiliser la technique avec compare-object et measure-object que je te signalais au début de la discussion. Remplace la partie comparaison de mon dernier exemple par ceci:

[code:1]
$ref.keys | foreach {
$bad = 0+(compare-object ([char[]]$ref.$_) ([char[]]$dif.$_) | measure-object).count
\&quot;{0} : {1} mauvaise{2} réponse{2}\&quot; -f $_, $bad, $(if ($bad -gt 1) {\&quot;s\&quot;})
}[/code:1]
Janel<br><br>Message édité par: janel, à: 1/10/07 14:25

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 5 mois #1030 par pgu
Réponse de pgu sur le sujet Re:Comparaison de chaine de caratères
Merci pour ton aide.
Le code explose encore , mais je pense que cela vient du fait que mes fichiers contiennent es ligne.

Comment et oû filtrer ces lignes vides ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 5 mois #1033 par Jacques Barathon
Pour ne pas incorporer les lignes vides, il suffit d'ajouter un filtre à la lecture du fichier:

[code:1]
$ref = @{}
get-content QCM-ref.txt | where {$_} | foreach {
$n,$v = $_.split(\&quot;;\&quot;«»)
$ref.$n = $v
}[/code:1]
Ou mieux, si tu veux n'avoir que les lignes qui contiennent un point-virgule:

[code:1]
$ref = @{}
get-content QCM-ref.txt | where {$_ -match \&quot;;\&quot;} | foreach {
$n,$v = $_.split(\&quot;;\&quot;«»)
$ref.$n = $v
}[/code:1]
A faire pour les deux fichiers, bien sûr...

Janel

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 5 mois #1116 par pgu
Réponse de pgu sur le sujet Re:Comparaison de chaine de caratères
J'ai du mettre ce script de côté, mais là il faut s'y remettre.
Mon algo à légèrement évoluer pour être plus générique: mon objectif est de comparer 2 fichiers , et d'en sortir le nombre de caractères différents.

Mes fichier pouvant être très gros, le pense coder l'algo suivant:
[code:1]
Pour chaque ligne de mes deux fichiers
|je compare les deux lignes
|si les deux lignes sont différentes
|je parcours tous les caratères de ma ligne et je compte un à un les caractères différents
| je prend la ligne suivante dans les deux fichiers
[/code:1]

si vous avez une meilleur idée...
A noter les problématiques pour ce script:
- les fichiers peuvent être très gros
- l'exécution doit être \&quot;rapide\&quot;
- le résultat se donne en caractère (un espace est un caractère)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 5 mois #1117 par Jacques Barathon
Je te propose la version suivante:

[code:1]
param ($reference, $difference)

# Ouverture des deux fichiers:

$file1 = [System.IO.File]::OpenText((dir $reference))
$file2 = [System.IO.File]::OpenText((dir $difference))

# initialisation du compteur de caractères différents:

$diff = 0

# Parcours des deux fichiers jusqu'à la fin de l'un de deux:

while (!$file1.EndOfStream -and !$file2.EndOfStream)
{
# Lecture des deux lignes en cours:

$line1 = $file1.ReadLine()
$line2 = $file2.ReadLine()

# Comptage du nombre de caractères différents:

$diff += (compare-object ([char[]]$line1) ([char[]]$line2) | measure-object).count
}

# Ajout du nombre de caractères restants dans le fichier le plus long:

$remainder = \&quot;\&quot;
if ($file1.EndOfStream -and !$file2.EndOfStream) { $remainder = $file2.ReadToEnd() }
if ($file2.EndOfStream -and !$file1.EndOfStream) { $remainder = $file1.ReadToEnd() }
if ($remainder) {
$remainder.Split(\&quot;`r`n\&quot;«») | foreach { $diff += $_.Length }
}

# Fermeture des fichiers:

$file1.Close()
$file2.Close()

# Et pour finir, on retourne le nombre total de caractères différents:

$diff[/code:1]
A priori ce script devrait répondre à ton besoin. Tu noteras que je reprends le principe que je t'avais déjà proposé en tout début de discussion pour comparer deux lignes et mesurer le nombre de caractères différents.

Egalement, pour optimiser la lecture de gros fichiers, j'ai préféré utiliser les API .NET, voir un billet assez ancien publié sur mon blog à ce sujet:

janel.spaces.live.com/Blog/cns!9B5AA3F6FA0088C2!285.entry

Commentaires bienvenus. Si ça marche, je posterai dans la rubrique contributions pour le concours de scripts (y'a pas de petits profits :)).

Janel

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.082 secondes
Propulsé par Kunena