2011-04-01 11 views
2

J'ai un fichier .txt avec une liste de 174 chaînes différentes. Chaque chaîne a un identifiant unique. Par exemple:Recherche de chaînes dans un fichier txt

123|this data is variable| 
456|this data is variable| 
789|so is this| 
etc.. 

Je veux écrire un programe en C# qui lit le fichier txt et afficher uniquement l'une des 174 chaînes si je spécifie l'ID de la chaîne que je veux. C'est parce que dans le fichier j'ai toutes les données sont variables, donc seul l'ID peut être utilisé pour tirer la chaîne. Donc, au lieu de finir avec l'exemple, je n'ai qu'une ligne.

par exemple seulement

123|this data is variable| 

me semble être capable d'écrire un programe qui va tirer juste l'ID du fichier txt et non l'intégralité de la chaîne ou un programme qui lit mearly le fichier entier et l'affiche . Mais je ne suis pas encore là pour faire exactement ce dont j'ai besoin. AIDEZ-MOI!

Eh bien, la chaîne réelle je sors du fichier txt n'a pas de '|' ils étaient juste dans l'exemple. Un exemple de la chaîne réelle serait: 0111111 (0010101) où les données entre parenthèses sont variables. Les parenthèses n'exsistent pas dans la vraie chaîne non plus.

espace de noms String_reader { class Program { static void Main (string [] args) { chaîne CheminFichier = @ "C: \ mon nom de fichier ici"; chaîne de caractères;

 if(File.Exists(filepath)) 

     { 
      StreamReader file = null; 
      try 
      { 
       file = new StreamReader(filepath); 
       while ((line = file.ReadLine()) !=null) 
       { 
        string regMatch = "ID number here"; //this is where it all falls apart. 
        Regex.IsMatch (line, regMatch); 

        Console.WriteLine (line);// When program is run it just displays the whole .txt file 
       } 
      } 
     } 
     finally{ 
      if (file !=null) 
       file.Close(); 
     } 
    } 
    Console.ReadLine(); 


    } 
} 

}

+1

Montrez-nous le code que vous avez déjà. – Carra

+2

salut. S'il vous plaît poster un exemple du code/approche que vous avez essayé jusqu'à présent. – trickwallett

+0

Vous codez bien. Tout ce dont vous avez besoin est de fixer votre motif pour votre expression régulière. Voir le post de Flynn. – Kipotlov

Répondre

1

Utilisez readlines pour obtenir un tableau de chaînes de lignes puis divisée chaîne sur le |

+0

En outre, vous pouvez saisir toutes les données à l'aide du fractionnement, puis les stocker dans une structure de type Dictionnaire , de sorte que vous n'ayez pas à obtenir constamment les données du fichier. –

+0

statique void Main (string [] args) { Chaîne filepath = @ "C: \ mon nom de fichier ici"; chaîne de caractères; si (Fichier.Existe (chemin de fichier)) { StreamReader file = null; try { file = new StreamReader (chemin de fichier); while ((line = file.ReadLine())! = Null) { – Matt

0

Vous pouvez utiliser la méthode Split pour diviser le texte entier en parties séparées par '|'. Alors tous les éléments pairs correspondront aux nombres des éléments impairs - aux cordes. Puis, convertissez certains éléments de données en nombres et en chaînes, c'est-à-dire en int [] ID et en chaîne [] Strs. Trouvez l'indice de l'ID donné avec IDX = Array.FindIndex (ID, ID.Equals) et la chaîne correspondante sera Strs [IDX]

List <int> IDs; 
List <string> Strs; 
for (int i = 0; i < data.Length - 1; i += 2) 
{ 
    IDs.Add(int.Parse(data[i])); 
    Strs.Add(data[i + 1]); 
} 
idx = Array.FindIndex(IDs, ID.Equals); // we get ID from input 
answer = Strs[idx]; 
1
FileInfo info = new FileInfo("filename.txt"); 
String[] lines = info.OpenText().ReadToEnd().Split(' '); 

foreach(String line in lines) 
{ 
    int id = Convert.ToInt32(line.Split('|')[0]); 
    string text = Convert.ToInt32(line.Split('|')[1]); 
} 
2

En supposant vous avez path et id.

Console.WriteLine(File.ReadAllLines(path).Where(l => l.StartsWith(id + "|")).FirstOrDefault()); 
1
  • Lire les données dans une chaîne
  • diviser la chaîne sur "|"
  • Lire les articles 2 par 2: clé: valeur, clé: valeur, ...
  • les ajouter à un dictionnaire

Maintenant, vous pouvez facilement trouver votre chaîne avec le dictionnaire [key].

3

Utilisez un Regex.Quelque chose dans le sens de Regex.Match("|"+inputString+"|",@"\|[ ]*\d+\|(.+?)\|").Groups[1].Value

Oh, j'ai presque oublié; Vous devrez remplacer le d+ par l'index réel souhaité. En ce moment, ça va juste vous obtenir le premier.

Le "|" avant et après la chaîne d'entrée s'assure que l'index et la valeur sont inclus dans un | pour tous les éléments, y compris le premier et le dernier. Il y a des façons de faire un Regex sans cela, mais à mon humble avis, ils rendent votre regex plus compliquée et moins lisible.

+0

Eh bien, la chaîne réelle je sors du fichier txt n'a pas de '|' ils étaient juste dans l'exemple. Un exemple de la chaîne réelle serait: 0111111 (0010101) où les données entre parenthèses sont variables. Les parenthèses n'existent pas dans la vraie chaîne non plus – Matt

+0

Eh bien, en utilisant la regex '@" 0111111 ([01] {7}) "' trouverait celui-là dans cette instance; Bien sûr, si vos données variables contiennent une valeur identique à un index valide, vous aurez des problèmes. – Flynn1179

1
private static IEnumerable<string> ReadLines(string fspec) 
    { 
     using (var reader = new StreamReader(new FileStream(fspec, FileMode.Open, FileAccess.Read, FileShare.Read))) 
     { 
      while (!reader.EndOfStream) 
       yield return reader.ReadLine(); 
     } 
    } 

    var dict = ReadLines("input.txt") 
     .Select(s => 
        { 
         var split = s.Split("|".ToArray(), 2); 
         return new {Id = Int32.Parse(split[0]), Text = split[1]}; 
        }) 
     .ToDictionary(kv => kv.Id, kv => kv.Text); 

S'il vous plaît noter que avec .NET 4.0 vous n'avez pas besoin de la fonction de readlines, car il y a ReadLines

Vous pouvez maintenant travailler avec ce que tout le dictionnaire:

Console.WriteLine(dict[12]); 
Console.WriteLine(dict[999]); 

Aucune erreur manipuler ici, s'il vous plaît ajouter votre propre

1

d'abord charger le fichier de trou à une chaîne.
puis essayez ceci:

string s = "123|this data is variable| 456|this data is also variable| 789|so is this|"; 
int index = s.IndexOf("123", 0); 
string temp = s.Substring(index,s.Length-index); 
string[] splitStr = temp.Split('|'); 
Console.WriteLine(splitStr[1]); 

espère que c'est ce que vous recherchez.

Questions connexes