开发者

comparing string and variable but failing based on contains

开发者 https://www.devze.com 2023-01-04 06:52 出处:网络
What I have going on is I have two files.Both files are delimited by \'|\'.If file 1 matches a line in file 2 I need to combine the lines.Here is the code:

What I have going on is I have two files. Both files are delimited by '|'. If file 1 matches a line in file 2 I need to combine the lines. Here is the code:

   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");
       }
   }

I realize that the math part isn't setup yet, b开发者_开发技巧ut I need to get the match part working.

Here is an example:

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

As you can see mathlines contains GSxil and so does addlines but my if (addlines.Contains) never fines the variable in addlines. Any help is always loved! Thanks.

Sorry forgot to mention that I need it to match exactly on the comparison. Also i need to split out the variable on the correct line that matches. So I would need to split out the 394735896576 this example and then append the 394735896576.


addLines.Contains(parse[0]) is going to match on the entire string; you need to match based on part. There are more efficient solutions, but a O(n^2) option is to use LINQ Any():

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


You could load all lines from addlines.txt into a dictionary and then use that to find a match for each line in mathlines.txt. This method would be much faster than what you have currently.

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);
0

精彩评论

暂无评论...
验证码 换一张
取 消