2013-05-07 2 views
4

J'ai un fichier. Chaque ligne ressemble à ce qui suit:Dans le fichier, si la ligne contient une sous-chaîne, récupérez toute la ligne à partir de la droite

[00000] 0xD176234F81150469: foo 

Ce que je tente de faire est, si une ligne contient une certaine sous-chaîne, je veux extraire tout le droit de la sous-chaîne trouvée. Par exemple, si je cherchais 0xD176234F81150469: dans la ligne ci-dessus, il retournerait foo. Chaque chaîne est de longueur variable. J'utilise C#.

À noter que chaque ligne du fichier ressemble à ce qui précède, avec un nombre base-16 entre crochets à gauche, suivi d'un hachage hexadécimal et un point-virgule, et une chaîne de caractères anglais par la suite.

Comment puis-je faire à ce sujet?

Modifier

Voici mon code:

private void button1_Click(object sender, EventArgs e) 
    { 
     Form1 box = new Form1(); 
     if(MessageBox.Show("This process may take a little while as we loop through all the books.", "Confirm?", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) 
     { 
      XDocument doc = XDocument.Load(@"C:\Users\****\Desktop\books.xml"); 

      var Titles = doc.Descendants("Title"); 

      List<string> list = new List<string>(); 

      foreach(var Title in Titles) 
      { 
       string searchstr = Title.Parent.Name.ToString(); 
       string val = Title.Value; 
       string has = @"Gameplay/Excel/Books/" + searchstr + @":" + val; 
       ulong hash = FNV64.GetHash(has); 
       var hash2 = string.Format("0x{0:X}", hash); 

       list.Add(val + " (" + hash2 + ")"); 
       // Sample output: "foo (0xD176234F81150469)" 
      } 

      string[] books = list.ToArray(); 

      File.WriteAllLines(@"C:\Users\****\Desktop\books.txt", books); 
     } 
     else 
     { 
      MessageBox.Show("Aborted.", "Aborted"); 
     } 
    } 

J'ai aussi itérés chaque ligne du fichier, en ajoutant à un list<>. J'ai dû accidentellement supprimé ceci en essayant les suggestions. Aussi, je suis très nouveau à C#. La principale chose que je suis perplexe est l'appariement.

+1

Eh bien, quel bit vous cause des difficultés? Prendre la sous-chaîne? Trouver des lignes correspondantes? Itérer sur le fichier ligne par ligne pour commencer? –

+0

Ce n'est généralement pas une opération très difficile à programmer. Pouvez-vous nous montrer votre code et où vous êtes coincé? Ensuite, nous essaierons de vous donner des suggestions dans la bonne direction. – Bazzz

+0

J'ai ajouté plus d'informations à mon message original. – Seabody

Répondre

0

Malheureusement, aucune des autres solutions n'a fonctionné pour moi. J'écrivais à travers les hashes en utilisant foreach, donc j'irais à travers tous les éléments des millions de fois inutilement. À la fin, j'ai fait ceci:

  using (StreamReader r = new StreamReader(@"C:\Users\****\Desktop\strings.txt")) 
      { 
       string line; 
       while ((line = r.ReadLine()) != null) 
       { 
        lines++; 
        if (lines >= 6) 
        { 
         string[] bits = line.Split(':'); 

         if(string.IsNullOrWhiteSpace(line)) 
         { 
          continue; 
         } 

         try 
         { 
          strlist.Add(bits[0].Substring(10), bits[1]); 
         } 
         catch (Exception) 
         { 
          continue; 
         } 
        } 
       } 
      } 

      foreach(var Title in Titles) 
      { 
       string searchstr = Title.Parent.Name.ToString(); 
       string val = Title.Value; 
       string has = @"Gameplay/Excel/Books/" + searchstr + ":" + val; 
       ulong hash = FNV64.GetHash(has); 
       var hash2 = " " + string.Format("0x{0:X}", hash); 

       try 
       { 
        if (strlist.ContainsKey(hash2)) 
        { 
         list.Add(strlist[hash2]); 
        } 
       } 
       catch (ArgumentOutOfRangeException) 
       { 
        continue; 
       } 
      } 

Cela m'a donné la sortie que je m'attendais dans un court laps de temps.

4

Vous pouvez utiliser File.ReadLines et cette requête Linq:

string search = "0xD176234F81150469:"; 
IEnumerable<String> lines = File.ReadLines(path) 
    .Select(l => new { Line = l, Index = l.IndexOf(search) }) 
    .Where(x => x.Index > -1) 
    .Select(x => x.Line.Substring(x.Index + search.Length)); 

foreach (var line in lines) 
    Console.WriteLine("Line: " + line); 
0
string file = ... 
string search= ... 
var result = File.ReadLines(file) 
       .Where(line => line.Contains(search)) 
       .Select(line => line.Substring(
            line.IndexOf(search) + search.Length + 1); 
1

Cela fonctionne si vous ne souhaitez pas utiliser la requête Linq.

//"I also iterated through every line of the file, adding it to a list<>." Do this again. 
List<string> li = new List<string>() 

//However you create this string make sure you include the ":" at the end. 
string searchStr = "0xD176234F81150469:"; 

private void button1_Click(object sender, EventArgs e) 
{ 
    foreach (string line in li) 
    { 
     string[] words; 
     words = line.Split(' '); //{"[00000]", "0xD176234F81150469:", "foo"} 

     if (temp[1] == searchStr) 
     { 
      list.Add(temp[2] + " (" + temp[1] + ")"); 
      // Sample output: "foo (0xD176234F81150469)" 
     } 
    } 
} 
Questions connexes