2010-06-23 5 views
0

Ce que j'ai en cours, c'est que j'ai deux fichiers. Les deux fichiers sont délimités par '|'. Si le fichier 1 correspond à une ligne du fichier 2, je dois combiner les lignes. Voici le code:comparaison chaîne et variable mais échec basé sur contient

string[] mathlines = File.ReadAllLines(@"C:\math.txt"); 
    var addlines = File.ReadAllLines(@"K:\add.txt"); 
    foreach (string ml in mathlines) 
    { 
     string[] parse = ml.Split('|'); 
     if (addlines.Contains(parse[0])) 
     { 
      File.AppendAllText(@"C:\final.txt", parse[0]+"|"+parse[1]+"\n"); 
     } 
     else 
     { 
      File.AppendAllText(@"C:\final.txt", ml + "\n"); 
     } 
    } 

Je réalise que la partie mathématique n'est pas encore configurée, mais j'ai besoin de faire fonctionner la partie de correspondance.

Voici un exemple:

mathlines:

dart|504.91 
GI|1782.06 
Gcel|194.52 
clay|437.35 
grado|217.77 
greGCR|14.82 
rp|372.54 
rp2|11.92 
gsg|349.92 
GSxil|4520.55 

addlines:

Gimet|13768994304 
GSxil|394735896576 
Ho|4994967296 
gen|485331304448 
GSctal|23482733690 
Obr|88899345920 

Comme vous pouvez le voir mathlines contient GSxil et le fait addlines mais mes if (addlines.Contains) jamais amendes la variable addlines. Toute aide est toujours aimée! Merci.

Désolé de ne pas mentionner que j'en ai besoin pour correspondre exactement à la comparaison. Aussi j'ai besoin de séparer la variable sur la bonne ligne qui correspond. Donc, je devrais diviser le 394735896576 cet exemple et puis ajouter le 394735896576.

+0

Le code fonctionne bien pour moi. Est-ce que K: \ add.txt est le bon chemin? –

+0

Les blocs if else ne font-ils pas la même chose? – tafa

+0

le bloc else est supposé être pour tout ce qui échoue, cela fonctionne comme prévu. –

Répondre

2

addLines.Contains(parse[0]) va correspondre sur la chaîne entière; vous devez correspondre en fonction de la pièce. Il existe des solutions plus efficaces, mais un O (n^2) option est d'utiliser LINQ Any():

if (addLines.Any(l => l.StartsWith(parse[0]))) 
{ 
... 
+0

Ce genre de travaux, mais il n'est pas assez précis de la comparaison par exemple, le GSxil correspond à GSxil_qwe2 et devrait correspondre à la GSxil. –

+0

Aussi, comment puis-je écrire la ligne de varistance exacte? ce qui signifie que si la variable 3 correspond au résultat, j'ai besoin d'écrire le split [1] de celui-ci. –

+0

Je construirais probablement un dictionnaire à partir d'addLines basé sur la division de chaque ligne sur le | Ensuite, vous pouvez simplement rechercher la clé dans le dictionnaire et utiliser sa valeur comme vous le souhaitez. Il est plus facile de répondre à des questions spécifiques si vous nous montrez ce que vous avez essayé. – dahlbyk

0

Vous pouvez charger toutes les lignes de addlines.txt dans un dictionnaire et utiliser alors que pour trouver un match pour chaque ligne dans mathlines.txt. Cette méthode serait beaucoup plus rapide que ce que vous avez actuellement.

string[] mathlines = File.ReadAllLines(@"C:\math.txt"); 
string[] addlines = File.ReadAllLines(@"K:\addlines.txt"); 
string[] finallines = new string[mathlines.Length]; 
var addlinesLookup = new Dictionary<string, string>(); 
for (int i = 0; i < addlines.Length; i++) 
{ 
    string[] parts = addlines[i].Split('|'); 
    if (parts.Length == 2) // Will there ever be more than 2 parts? 
    { 
    addlinesLookup.Add(parts[0], parts[1]); 
    } 
} 
for (int i = 0; i < mathlines.Length; i++) 
{ 
    string[] parts = mathlines[i].Split('|'); 
    if (parts.Length >= 1) 
    { 
    if (addlinesLookup.ContainsKey(parts[0])) 
    { 
     finallines[i] = mathlines[i] + "|" + addlinesLookup[parts[0]] + "\n"; 
    } 
    { 
     finallines[i] = mathlines[i] + "\n"; 
    } 
    } 
} 
File.AppendAllLines(@"C:\final.txt", finallines, Encoding.ASCII); 
Questions connexes