C#读取.txt文件格式化

Pat*_*ick 4 c# file-io

我有一个特定的文本文件:

197 17.16391215
198 17.33448519
199 17.52637986
200 17.71827453
201 17.9101692
202 18.10206387
203 18.29395854
204 18.48585321
205 18.67774788
206 18.86964255
207 19.06153722
Run Code Online (Sandbox Code Playgroud)

等等.需要说明的是:第一列(197,198,..)表示帧号,第二列(17.xxx,...)表示链接到帧号的位置,反之亦然.
现在我想在不同的数组中分隔每一行.同

string[] delimiters = new string[] {" ", "\r\n" };
string line = reader.ReadToEnd();
string[] test = line.Split(delimiters, StringSplitOptions.None);
Run Code Online (Sandbox Code Playgroud)

我有一个包含Textfile中所有条目的数组.但我希望所有framenumbers(第一列)在一个Array中,而在另一个第二个Array中所有位置.

我需要做的工作如下:我将得到一个位置编号(例如18.10)然后我必须在第二列的.txt文件中搜索最接近的匹配编号并返回链接的框架编号(在这种情况下为202) .我的想法是生成两个匹配的数组,在一个中搜索位置,从另一个中返回framenumber.当我在互联网上搜索了半天时,发现很多东西,比如所有的.select东西,但没有任何东西直接匹配我的问题; 但也许我此刻是愚蠢的.

所以感谢任何帮助.希望你能理解我的英语:P

Jod*_*ell 5

在评论后编辑2,您希望每秒重复搜索24次.

首先,让我来说,如果你试图播放一组帧,那么查找列表是错误的方法.正确的方法超出了问题的范围,但实质上你想要限制顺序数据的显示.

假设值不会改变,并且您的查找是随机的,而不是顺序的.你可以试试这样的代码.

private readonly List<int> ids = new List<int>();
private readonly IList<double> values = new List<double>();

public void LoadData(string path)
{
    foreach (var line in File.ReadLines(path))
    {
        var pair = line.Split(' ');
        this.ids.Add(int.Parse(pair[0]));
        this.values.Add(double.Parse(pair[1]));
    }
}

public double Lookup(int id)
{
    return this.values[this.ids.FindIndex(i => i >= id)];
}
Run Code Online (Sandbox Code Playgroud)

如果需要更高的性能,可以在此处使用专门的二进制搜索.

阅读后编辑并希望了解

并假设帧按递增的Id顺序排列.

double GetFrameValue(string path, int limit)
{
    string [] parts;
    foreach (var line in File.ReadLines(path))
    {
       parts = line.Split(' '); 
       var frameId = int.Parse[0];
       if (frameId >= limit)
       {
           break;
       }
    }

    return double.Parse(parts[1]);
}
Run Code Online (Sandbox Code Playgroud)

这具有明显的优点,即只在必要时读取文件而不是将其全部保存在内存中.如果你要在随机帧位置读取文件repeatley,那么Collection除非文件非常大,否则你最好将它全部加载到具有快速比较性能的文件中.


怎么样,

IEnumerable<KeyValuePair<int, double>> ReadFrames(string path)
{
    foreach (var line in File.ReadLines(path))
    {
       var parts = line.Split(' '); 
       yield return new KeyValuePair<int, double>(
           int.Parse(parts[0]),
           double.Parse(parts[1]));
    }
}

var frames = new Dictionary<int, double>(ReadFrames("yourfile.txt"));

var frameIds = frames.Keys;
var values = frames.Values;
Run Code Online (Sandbox Code Playgroud)

如评论中所述,

var frames = File.ReadLines("yourfile.txt")
    .Select(line => line.Split(' '))
    .ToDictionary(pair => int.Parse(pair[0]), pair => double.Parse(pair[1])); 

var frameIds = frames.Keys;
var values = frames.Values;
Run Code Online (Sandbox Code Playgroud)

也应该工作.

  • 我喜欢使用KeyValuePair,但是如果你要将整个文件读入一个数组,为什么还要费心呢?为什么不只是一个.select()投影? (3认同)