如何在文本文件中定位和存储字符位置

时间:2011-07-20 21:31:06

标签: c# linq

我正在尝试创建按字典顺序排序的单词索引及其在文本文件中的位置。

在本论坛的专家帮助下,我能够创建按字典顺序排序的单词索引。我现在需要帮助存储按字典顺序排序的单词索引的位置

这是我到目前为止: - 包含如下数据的文本文件(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);

                }
            }
        }

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

如果您可以使用{行号,行号中的字符}对作为位置,那么只需计算行数和每行数字就可以很容易地计算代码。