在这里工作的人需要从文本文件中的某些数字进行一些计算。我知道如何进行计算,但之前我还没有使用过文本文件。所以我花了一夜的时间阅读并为我需要的第一个数字写了一些东西,但它没有用。
所以这是文件的一个例子。
因此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
所以如果你看到这里所有的行都有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
您可以运行反向循环来设置结束值
答案 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;
}