2009-12-06 10 views
0

Je dois lire le fichier et scinder la chaîne en table de hachage en C#.Comment lire un fichier, diviser les chaînes et écrire la sortie dans une table de hachage en C#?

Par exemple;

1231231 Salut c'est la première entrée/Salut c'est la deuxième entrée

Actuellement, je lis les lignes dans la ligne de fichiers en ligne à l'aide d'un StreamReader, puis je diviser chaque ligne à 3 chaînes différentes . Par exemple, "1231231" à une chaîne, puis à "/" signe à une autre chaîne après le signe "/" à une autre chaîne. 12312331 sera la clé de la table de hachage, et les autres seront les valeurs de la table de hachage. Je suis coincé sur cette partie.

+2

On dirait que quelqu'un ne fait plus ses devoirs. –

+0

Donc, la clé est toujours un nombre au début de la ligne, et vous voulez une liste de chaînes séparées par/comme valeur? –

+0

Je pense que vous devez clarifier ce que vous essayez de faire. Comme indiqué, il semble que vous voulez avoir deux entrées dans la table de hachage, une avec la clé = 1231231, valeur = "Salut c'est la première entrée" et la seconde avec la clé = 1231231, value = "salut c'est la deuxième entrée" . Ce n'est pas possible. – jason

Répondre

4

En supposant que vous ayez un jeu d'entrées assez régulier, vous voudrez probablement utiliser un regular expression pour cela.

Ce modèle semble être ce que vous voulez:

^(\d+)\s+([^/]+)\s+/\s+(.+)$ 

Ce serait:

  • ^: Anchor au début de la chaîne
  • (\d+): un ou plusieurs chiffres
  • \s+: 1 ou plusieurs caractères d'espacement
  • ([^/]+): 1 ou plusieurs caractères qui ne sont pas égaux '/'
  • \s+/\s+: 1 ou plusieurs espaces, plus une barre oblique et une ou plusieurs caractères d'espacement
  • (.+): 1 ou plus de caractère
  • $: Anchor à la fin de chaîne
+0

Regex est une belle bête :) Utilisez-le jusqu'à ce que les performances deviennent un problème, puis réécrivez. –

0

en utilisant regex Bobby ..

static void Main(string[] args) 
    { 
      Hashtable hashtable = new Hashtable(); 
      string[] fileLines = File.ReadAllLines(@"PATH\FILE.TXT"); 

      foreach (string line in fileLines) 
      { 
      var match = Regex.Match(line, @"^(\d+)\s+([^/]+)\s+/\s+(.+)$"); 
      hashtable.Add(match.Groups[0].ToString(), new string[] { match.Groups[1].ToString(), match.Groups[2].ToString() }); 
      } 
     } 

Les valeurs sont Hashtable inséré en tant que tableau de chaînes car la clé doit être unique.

0

pourrait être plus optimale, mais il va travailler:

 char stringSplit = '/'; 
     char keySplit = ' '; 
     Dictionary<string,string[]> dictionary = new Dictionary<string, string[]>(1000); 
     using(StreamReader sr = new StreamReader(@"c:\somefile.txt")) 
     { 
      string line; 
      while ((line = sr.ReadLine()) != null) 
      { 
       int keyIndex = line.IndexOf(keySplit); 
       string key = line.Substring(0, keyIndex); 
       string[] values = line.Substring(keyIndex + 1).Split(stringSplit); 
       dictionary.Add(key,values); 
      } 
     } 
0

code pour ajouter des entrées à la table de hachage:

Hashtable hashtable = new Hashtable(new EqualityComparer()); 
string[] fileLines = File.ReadAllLines(@"somePath"); 
foreach (var fileLine in fileLines) 
{ 
    int indexOfSpace = fileLine.IndexOf(' '); 
    int indexOfSlash = fileLine.IndexOf('/'); 
    string keyString = fileLine.Remove(indexOfSpace); 
    string firstValue = 
      fileLine.Substring(indexOfSpace, indexOfSlash - indexOfSpace - 1); 
    string secondValue = fileLine.Substring(indexOfSlash + 1); 
    hashtable.Add(new Key(keyString), firstValue); 
    hashtable.Add(new Key(keyString), secondValue); 
} 

classe clé pour envelopper même chaîne:

public class Key 
{ 
    private readonly string s; 

    public Key(string s) 
    { 
     this.s = s; 
    } 

    public string KeyString 
    { 
     get { return s; } 
    } 
} 

Égalité Le comparateur fournit GetHashCode fonctionnalité afin de m Ake deux clés basées sur la même chaîne vont à la même entrée en hashtable:

public class EqualityComparer : IEqualityComparer 
{ 
    public bool Equals(object x, object y) 
    { 
     return ReferenceEquals(x, y); 
    } 

    public int GetHashCode(object obj) 
    { 
     return ((Key) obj).KeyString.GetHashCode(); 
    } 
}