跳过文本文件的行

时间:2017-09-13 09:58:11

标签: c#

所以我昨天得到了一些帮助,但现在我需要做出改变,我的改变似乎不起作用。想看看有人会帮我解决我做错的事。

以下是

中读取的文件示例

Example

现在最初这是读取0.264的FSD编号,然后读取3.4572第一列中的第一个数字以及该列的最后一个数字。这很好。但现在我知道FSD号码需要更长时间,我不再需要第一个号码3.4572。相反,我需要在最后一列中没有0.00的第一个数字,然后仍然是最后一个数字。所以这就是我所拥有的,但它根本没有抓住任何东西,if (dataWithAvgVolts.Count() > 1)被跳过了。

public partial class FrmTravelTime : Form
{
    const string FSD__Line_Identifier = "Drilling Data";
    const string Data_Start_Point_Identifier = "AVG_VOLTS";
    const string Spark_Point_Identifier = "0.00";
    static readonly char[] splitter = { ' ', '\t' };

    public FrmTravelTime()
    {
        InitializeComponent();
    }
    private void btnCalculate_Click(object sender, EventArgs e)
    {
        foreach (DataGridViewRow row in DGV_Hidden.Rows)
        {
            FileInfo info = new FileInfo();
            {
                var lines = File.ReadAllLines(row.Cells["colfilelocation"].Value.ToString());
                var fsdLine = lines.FirstOrDefault(line => line.Contains(FSD__Line_Identifier));
                var dataWithAvgVolts = lines.SkipWhile(line => line.Contains(Data_Start_Point_Identifier + Spark_Point_Identifier + FSD__Line_Identifier)).ToList();

                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]);
                }

                info.finalnum = info.startvalue - info.endvalue;


            }
        }
    }

public class FileInfo
{
    public double startvalue;
    public double endvalue;
    public double firstnum;
    public double finalnum;
}

Example 2

所以你在这里看到最后没有0.00的第一行是

3.0164 7793 1 0 0.159 0.02

因此我的info.startvalue将为3.0164

直到最后一行直到最好的100行 2.7182 8089 0 0 0.015 22.19

所以我的info.endvalue应为2.7182

@Amit

                var lines = File.ReadAllLines(row.Cells["colfilelocation"].Value.ToString());
                var fsdLine = lines.FirstOrDefault(line => line.Contains(FSD__Line_Identifier));
                info.FSD = fsdLine.Substring(fsdLine.IndexOf(FSD_Identifier) + FSD_Identifier.Length, 7);
                var dataWithAvgVolts = lines.SkipWhile(line => !line.Contains(Data_Start_Point_Identifier)).ToList();
                var data = lines.Where(line => (!line.Contains(Data_Start_Point_Identifier) && !line.Contains(FSD__Line_Identifier) && !line.EndsWith("0.00"))).ToList();

                if (data.Count > 1)
                {
                    var line = data[0];
                    var tempdata = data[0].Split(splitter);
                    info.startvalue = Convert.ToDouble(tempdata[0]);
                    var thisdata = data[data.Count - 1].Split(splitter);
                    info.endvalue = Convert.ToDouble(thisdata[0]);
                }

1 个答案:

答案 0 :(得分:1)

您的SkipWhile条件不正确。

  line => !line.Contains(Data_Start_Point_Identifier + Spark_Point_Identifier + FSD__Line_Identifier)

意味着AVG_VOLTS0.00Drilling Data。你是说,跳过文本文件,直到该行不包含AVG_VOLTS0.00Drilling数据。你在任何地方都没有这一行。所以,基本上,你似乎正在跳过整个文件。提出一个其他条件,这将有效。

此行返回所有没有“钻取数据”字,“AVG_VOLTS”字的行,并且不以“0.00”结尾。

var data = lines.Where(line=>(!line.Contains(Data_Start_Point_Identifier) && !line.Contains(FSD__Line_Identifier) && !line.EndsWith("0.00"))).ToList();

然后,取出行,然后处理。

如果条件可以

      if (data.Count > 1)
        {
            var line = data[0];
            var tempdata = data[0].Split(splitter);
            info.startvalue = Convert.ToDouble(tempdata[0]);
            var thisdata = data[data.Count - 1].Split(splitter);
            info.endvalue = Convert.ToDouble(thisdata[0]);
        }