从文本文件中挑选特定数字并分配给变量

时间:2017-09-12 11:14:05

标签: c# regex

在这里工作的人需要从文本文件中的某些数字进行一些计算。我知道如何进行计算,但之前我还没有使用过文本文件。所以我花了一夜的时间阅读并为我需要的第一个数字写了一些东西,但它没有用。

所以这是文件的一个例子。

Example

因此FSD: 0.264之后的第一个数字我需要读取该数字并保存到变量中。每个文件的编号总是不同的。然后我需要读取变量的第一个3.4572数字。以及您在此处看不到的那一列的最后一个数字,但是对于示例,它可以是3.3852图像中显示的最后一个读取并保存到变量中的数字。

也许我做得比实际需要的要难得多但是这就是我在玩的东西

public partial class FrmTravelTime : Form
{
    string file = "";
    public FrmTravelTime()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        DialogResult result = openFileDialog1.ShowDialog();
        if (result == DialogResult.OK)
        {
            file = openFileDialog1.FileName;
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        var sLines = File.ReadAllLines(file)
        .Where(s => !s.StartsWith("FSD:"))
        .Where(s => !string.IsNullOrWhiteSpace(s))
        .Select(s => new
        {
            SValue = Regex.Match(s, "(?<=S)[\\d.]*").Value,
        })
    .ToArray();

        string Value = "";

        for (int i = 0; i < sLines.Length; i++)
        {
            if (sLines[i].SValue == "")
            {
                Value = (sLines[i].SValue);
            }
        }
    }
}

编辑@Ramankingdom

New Example

所以如果你看到这里所有的行都有0.00的结尾列,直到我们到达 3.0164 7793 1 0 0.159 0.02

所以我想做的就是编辑我们所做的工作,跳过最后一列中包含0.00列的所有内容,并使第一个非0.00成为{{1在这种情况下info.firstvalue

现在我自己尝试并使用了它 3.0164

但这会打破var data = lines.Where(line => (!line.Contains(Data_Start_Point_Identifier) && !line.Contains(FSD__Line_Identifier) && !line.EndsWith("0.00"))).ToList();info.startvalue

所以我想我会和你核实一下。 所以我尝试了这个,但我在data = dataWithAvgVolts[dataWithAvgVolts.Count - 1].Split(splitter);

上一直收到无效数据错误
info.startvalue

您可以运行反向循环来设置结束值

1 个答案:

答案 0 :(得分:0)

这是代码

class Program
{
    const string FSD_Identifier = "FSD:";
    const string FSD__Line_Identifier = "Drilling Data";

    const string Data_Start_Point_Identifier = "AVG_VOLTS";
    static readonly char[] splitter = {' ','\t'};
    static void Main(string[] args)
    {
        var result =  GetFileInfo("c:\\sample.txt");
    }

    private static MyFileInfo GetFileInfo(string path)
    {
        MyFileInfo info = new MyFileInfo();
        try
        {
            var lines = File.ReadAllLines(path);
            var fsdLine  = lines.FirstOrDefault(line => line.Contains(FSD__Line_Identifier));
            info.FSD =  fsdLine.Substring(fsdLine.IndexOf(FSD_Identifier) + FSD_Identifier.Length, 10); // take lenght you can specify or your own logic
            var dataWithAvgVolts = lines.SkipWhile(line => !line.Contains(Data_Start_Point_Identifier)).ToList<string>();

                if (dataWithAvgVolts.Count() > 1)
                {
                    var data  =  dataWithAvgVolts[1].Split(splitter);
                    info.startvalue = Convert.ToDouble(data[0]);
                    data = dataWithAvgVolts[dataWithAvgVolts.Count-1].Split(splitter);
                    info.endvalue = Convert.ToDouble(data[0]);
                }
        }
        catch (Exception ex)
        {
            //logging here
        }

        return info;
    }
}

public class MyFileInfo
{
    public string FSD;
    public double startvalue;
    public double endvalue;
}