跳过文本文件的行。

3

昨天我得到了一些帮助,但现在我需要做出一些更改,我的更改似乎不起作用。想知道是否有人能帮我看看我做错了什么。

这是一个文件读取的示例:

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

AVG_VOLTS不包含在找到0.00的同一行中。 - Steve
1
根据您分享的文件days,输出应该是什么? - Chetan
第一行不包含“0.00”的是“3.0164”,但由于有很多“0.00”,它没有显示出来。因此,我只需要获取“3.0164”,然后获取最后一个数字,在这个特定的文件中,它远在“2.7182”之后,作为“info.startvalue”和“info.endvalue”。 - Logan
你能否在某个地方分享你的文本文件? - Amit Kumar Singh
当然,这个没有任何专有内容 https://expirebox.com/download/077a8d3c4e68eb2d110e07c3ee3396fc.html - Logan
1个回答

1
你的SkipWhile条件不正确。
  line => !line.Contains(Data_Start_Point_Identifier + Spark_Point_Identifier + FSD__Line_Identifier)

这意味着 AVG_VOLTS0.00钻探数据。您的意思是,跳过文本文件,直到该行不包含AVG_VOLTS0.00钻探数据。您在任何地方都没有这一行。因此,基本上,您似乎跳过了整个文件。添加一个else条件,那样会起作用。

此行返回所有不含“钻掘数据”单词、“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]);
        }

2
这不是一个解决方案,只是一个问题的指示。这应该是一条注释吗? - EpicKip
那我只需要告诉它如果包含就跳过吗?我尝试了,但是info.startvalue会报格式不正确的错误。但是我确实想跳过所有直到该行没有0.00,然后取第一个数字,即在这种情况下为0.02的位置,即3.0164 - Logan
例如 var data = lines.All(line => !line.EndsWith("0.00")).ToList(); .ToList() 不起作用,因为没有 .ToList 的选项。 - Logan
@Amit 好的,您的编辑确实给了我一个从我需要开始的地方开始的列表。然后我在info.startvalue = Convert.ToDouble(data [0]);上遇到一个错误,表示数据格式不正确。附加信息:输入字符串格式不正确。 - Logan
@Logan,根据我从你的问题代码中的理解,我已经加入了if条件来提取数据。您可以根据自己的选择更改变量。 - Amit Kumar Singh
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接