2011-07-20 13 views
0

単語の辞書順索引索引をテキストファイル内の位置と共に作成しようとしています。テキストファイル内の文字位置を特定して保存する方法

このフォーラムのエキスパートの助けを借りて、私は辞書的にソートされた単語のインデックスを作成できます。私は今、単語の辞書編集的にソートされたインデックスの位置を保存するのに助けが必要です

これは私がこれまで持っているものです: - 次のようなデータを含むテキストファイル(sometextfile.txt): "これはサンプルテキストファイルです「

 private const string filepath = @"d:\sometextfile.txt"; 
     using (StreamReader sr = File.OpenText(filepath)) 
     { 
      string input; 
      //dictionary to store the position of the characters in the file as long and the lexicographically sorted value as string 
      var parts = new Dictionary<long,string>(); 

      while ((input = sr.ReadLine()) != null) 
      { 
       string[] words = input.Split(' '); 
       foreach (var word in words) 
       { 
        var sortedSubstrings = 
         Enumerable.Range(0, word.Length) 
          .Select(i => word.Substring(i)) 
          .OrderBy(s => s); 
       parts.AddRange(<store the position of the character>, sortedSubstrings); 

       } 
      } 
     } 

答えて

1

ReadLineを使用すると、ファイル内の自分の位置に関する重要な情報が失われます。その位置を求めることができるバイト位置にする場合は、行の終わりは改行(\ r)または改行(\ n)またはその両方でマークすることができます。そのため、行末にいくつのバイトがあるかを知る必要があります。また、(テキストファイルのエンコーディングによっては)さまざまなバイト数で文字を表現することもできます。私はあなたの位置を追跡できるように、より低いレベルでファイルを読むことをお勧めします。

var parts = new Dictionary<long,string>(); 
using (System.IO.StreamReader sr = new System.IO.StreamReader(myfile)) 
{ 
    var sb = new System.Text.StringBuilder(); 
    long currentPosition = 0; 
    long wordPosition = 0; 
    bool wordStarted = false; 
    int nextCharNum = sr.Read(); 
    while (nextCharNum >= 0) 
    { 
     char nextChar = (char)nextCharNum; 
     switch(nextChar) 
     { 
     case ' ': 
     case '\r': 
     case '\n': 
      if (wordStarted) 
      { 
       parts[wordPosition] = sb.ToString(); 
       sb.Clear(); 
       wordStarted = false; 
      } 
      break; 
     default: 
      sb.Append(nextChar); 
      if (!wordStarted) 
      { 
       wordPosition = currentPosition; 
       wordStarted = true; 
      } 
      break; 
     } 
     currentPosition += sr.CurrentEncoding.GetByteCount(nextChar.ToString()); 
     nextCharNum = sr.Read(); 
    } 
    if (wordStarted) 
     parts[wordPosition] = sb.ToString(); 
} 
foreach (var de in parts) 
{ 
    Console.WriteLine("{0} {1}", de.Key, de.Value); 
} 
+0

こんにちは、あなたがそれを好きなら、あなたは受け入れ答えとして、または有用な答えとしてそれをマークすることができ – Fraiser

+0

...お返事をいただき、ありがとうございます。それはあなたの "感謝"本当のブーストを与える:) – BlueMonkMN

0

あなたはそれだけで行をカウントすることにより、各ラインカウント言葉のためにあなたのコード内で計算するのは非常に簡単であるよりも、位置として、{行番号、行のワード数}のペアを使用することができます。

関連する問題