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

Plus d'informations
il y a 13 ans 7 mois #1021 par pgu
Voilà ma problématique:
j'ai 2 chaines de caractères, et je veux connaitre au caractère près la différence entre ces deux chaînes.

Dois-je parcourir moi même ma chaîne (en utilisant .SubString) , ou connaisez vous une méthode qui me donne directement le nombre de caratères différents ?

Message édité par: Patrice33, à: 28/09/07 17:59<br><br>Message édité par: Arnaud, à: 30/11/07 10:05

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

Plus d'informations
il y a 13 ans 7 mois #1022 par Jacques Barathon
Si c'est uniquement le nombre de caractères différents que tu veux (considérant que les positions dans les chaînes sont importantes, c'est-à-dire qu'un E en 1ere position d'une chaîne est différent d'un E en 3e position dans l'autre chaîne), ceci devrait te convenir:

[code:1](compare-object ([char[]]$c1) ([char[]]$c2) | measure-object).count[/code:1]
Le transtypage des deux chaînes en tableaux de caractères est important pour que la comparaison se fasse caractère par caractère.

Janel

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

Plus d'informations
il y a 13 ans 7 mois #1023 par pgu
Réponse de pgu sur le sujet Re:Comparaison de chaine de caratères
Pour la petite histoire, mon objectif est de comparer deux fichiers afin d'analyser un QCM (mais oui, les questionnaires avec les coches, comme le permi de conduire).
J'ai donc un fichier référence, et un résultats
chaque fichier à le même format. Exemple:

Doc numero001;000X
Doc numero002;0X00
Doc numero003;0X00

Lors de la comparaison, les numéros ne changent pas, et seule la partie de 0 et X peux changer.
ma comparaison doit donc se faire en comparent les caractères ayant la même position sur un numéro de ligne.

voilà mon début de code:

[code:1]
$FileRef = Get-Content $args[0]
$FileDif = Get-Content $args[1]
$nError = 0
{
if ($FileRef[$i] -ne $FileDif[$i])
{
#code pour comparer chacaratère
}
}
Write-host $nError
[/code:1]

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

Plus d'informations
il y a 13 ans 7 mois #1024 par pgu
Réponse de pgu sur le sujet Re:Comparaison de chaine de caratères
En plus de Comment faire au mieux ma comparaison, je me pose une autre question:

Y a t-il une taille maximum pour la manipuation de fichiers ?

Sur des fichiers très gros, comment réagit Powershell ?
Charge-t-il une partie du fichier seulement, ou fait-il une tentative de tout charger en mémoire ?<br><br>Message édité par: Patrice33, à: 1/10/07 12:25

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

Plus d'informations
il y a 13 ans 7 mois #1025 par Jacques Barathon
Si je comprends bien, tu veux comparer les lignes contenant des ronds et des croix deux à deux, et si une ligne répondue n'est pas comma la ligne de référence, c'est une erreur. C'est ça?

Si c'est bien ça, la solution suivante devrait te convenir:

[code:1]
# lecture du fichier de référence dans un tableau associatif:
$ref = @{}
get-content QCM-ref.txt | foreach {
$n,$v = $_.split(\&quot;;\&quot;«»)
$ref.$n = $v
}

# lecture du fichier de réponses dans un tableau associatif:
$dif=@{}
get-content QCM-dif.txt | foreach {
$n,$v = $_.split(\&quot;;\&quot;«»)
$dif.$n = $v
}

# comparaison des deux:
$ref.keys | foreach {
if ($dif.$_ -eq $ref.$_) {\&quot;$_ : ok\&quot;}
else {\&quot;$_ : erreur\&quot;}
}[/code:1]
J'ai supposé que le format de chaque fichier était du genre:

Question1;00x000
Question2;0x0000
etc

Si tu utilises un autre caractère que le point-virgule pour séparer le nom de la question et les réponses, modifie la méthode Split(\&quot;;\&quot;) en conséquence.

Janel

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

Plus d'informations
il y a 13 ans 7 mois #1026 par Jacques Barathon

Y a t-il une taille maximum pour la manipuation de fichiers ?


Non, en tout cas pas dans les limites de la mémoire du système il me semble.

Sur des fichiers très gros, comment réagit Powershell ?
Charge-t-il une partie du fichier seulement, ou fait-il une tentative de tout charger en mémoire ?


Lorsque la commandelette get-content est insérée dans un pipeline, elle transmet chaque ligne lue à la commande suivante dans le pipeline avant de lire la ligne suivante. Cela permet de ne pas surcharger la mémoire avec un stockage complet du fichier avant d'avoir à le passer à la commande suivante.

Attention, la syntaxe suivante fréquemment rencontrée n'offre pas cet avantage. Au contraire, dans ce cas get-content lit tout le fichier en mémoire avant de passer à la suite:

$fichier = get-content monfichier.txt
foreach ($ligne in $fichier) {...}

La variante suivante ne fait pas mieux:

foreach ($ligne in (get-content monfichier.txt)) {...}

Seule la syntaxe suivante est économe en termes de mémoire:

get-content monfichier.txt | foreach {...}

De plus, jette un oeil à l'aide en ligne de get-content:

* Le paramètre -totalCount permet de préciser le nombre de lignes qu'on veut lire (utile si on sait d'avance qu'on ne veut parcourir que les 10 premières lignes d'un fichier qui en compte 100 000).

* Le paramètre -readCount permet de préciser combien de lignes on veut lire à chaque fois - par défaut, get-content lit les lignes une par une, mais on peut vouloir les lire par paquets de 10, ou autre. Attention, si get-content est dans un pipeline, c'est le nombre de lignes spécifié qui sera passé comme un objet unique à la commande suivante. Le gain de performance peut être notable, mais il peut y avoir des effets de bord dans le traitement des résultats (à voir selon le contexte).

Enfin, si les performances ne sont pas satisfaisantes malgré ces astuces, tu peux utiliser les API .NET directement pour accéder plus rapidement à un fichier texte. Tu peux voir un billet assez ancien sur mon blog où j'évoquais ce sujet:

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

Bon courage,
Janel

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

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