C# 从文本文件中选取特定数字并分配给变量
这里有人需要从文本文件中的一些数字进行一些计算。我知道如何计算,但我以前从未使用过文本文件。所以我花了一整晚的时间阅读并为我需要的第一个数字写了一些东西,但它不起作用 下面是这个文件的一个例子 所以在FSD:0.264之后的第一个数字,我需要读取这个数字并保存到一个变量中。每个文件的编号始终不同。然后我需要读取变量的第一个C# 从文本文件中选取特定数字并分配给变量,c#,regex,C#,Regex,这里有人需要从文本文件中的一些数字进行一些计算。我知道如何计算,但我以前从未使用过文本文件。所以我花了一整晚的时间阅读并为我需要的第一个数字写了一些东西,但它不起作用 下面是这个文件的一个例子 所以在FSD:0.264之后的第一个数字,我需要读取这个数字并保存到一个变量中。每个文件的编号始终不同。然后我需要读取变量的第一个3.4572数字。以及该列的最后一个数字,您在这里看不到,但对于示例来说,它可以是3.3852图像中显示的最后一个,读取并保存到变量中 也许我让事情变得更难了,但这就是我一直
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);
}
}
}
}
您可以运行反向循环来设置结束值,代码如下
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;
}
类程序
{
常量字符串FSD_Identifier=“FSD:”;
const string FSD\uuu Line\u Identifier=“钻井数据”;
常量字符串数据\u起始点\u标识符=“平均电压”;
静态只读字符[]拆分器={'','\t'};
静态void Main(字符串[]参数)
{
var result=GetFileInfo(“c:\\sample.txt”);
}
私有静态MyFileInfo GetFileInfo(字符串路径)
{
MyFileInfo=新建MyFileInfo();
尝试
{
var lines=File.ReadAllLines(路径);
var fsdLine=lines.FirstOrDefault(line=>line.Contains(FSD\u line\u标识符));
info.FSD=fsdLine.Substring(fsdLine.IndexOf(FSD_Identifier)+FSD_Identifier.Length,10);//获取您可以指定的长度或您自己的逻辑
var dataWithAvgVolts=lines.SkipWhile(line=>!line.Contains(Data_Start_Point_Identifier)).ToList();
如果(dataWithAvgVolts.Count()>1)
{
var data=dataWithAvgVolts[1]。拆分(拆分器);
info.startvalue=Convert.ToDouble(数据[0]);
data=dataWithAvgVolts[dataWithAvgVolts.Count-1].Split(拆分器);
info.endvalue=Convert.ToDouble(数据[0]);
}
}
捕获(例外情况除外)
{
//在这里登录
}
退货信息;
}
}
公共类MyFileInfo
{
消防处;
公共双星价值;
公共双端价值;
}
这是代码
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;
}
类程序
{
常量字符串FSD_Identifier=“FSD:”;
const string FSD\uuu Line\u Identifier=“钻井数据”;
常量字符串数据\u起始点\u标识符=“平均电压”;
静态只读字符[]拆分器={'','\t'};
静态void Main(字符串[]参数)
{
var result=GetFileInfo(“c:\\sample.txt”);
}
私有静态MyFileInfo GetFileInfo(字符串路径)
{
MyFileInfo=新建MyFileInfo();
尝试
{
var lines=File.ReadAllLines(路径);
var fsdLine=lines.FirstOrDefault(line=>line.Contains(FSD\u line\u标识符));
info.FSD=fsdLine.Substring(fsdLine.IndexOf(FSD_Identifier)+FSD_Identifier.Length,10);//获取您可以指定的长度或您自己的逻辑
var dataWithAvgVolts=lines.SkipWhile(line=>!line.Contains(Data_Start_Point_Identifier)).ToList();
如果(dataWithAvgVolts.Count()>1)
{
var data=dataWithAvgVolts[1]。拆分(拆分器);
info.startvalue=Convert.ToDouble(数据[0]);
data=dataWithAvgVolts[dataWithAvgVolts.Count-1].Split(拆分器);
info.endvalue=Convert.ToDouble(数据[0]);
}
}
捕获(例外情况除外)
{
//在这里登录
}
退货信息;
}
}
公共类MyFileInfo
{
消防处;
公共双星价值;
公共双端价值;
}
文件是否只包含一行带有“FSD:”的内容,或者是否存在多个事件?如果“钻井数据FSD:”部分是静态的,您可以对该部分使用decimal.Parse(Substring(…).TrimEnd())
。然后循环从第4行开始的行(或第3行,如果第一个似乎为空的行已被跳过),然后取决于:列是否固定宽度(然后再次使用子字符串)或制表符分隔(然后拆分和小数。解析第一项)。如果我理解正确,对于每个输入文件,您有两个标题行,后跟N个数据行。您想要第一个标题行的描述值,以及第一个和最后一个数据行的第一列值吗?(编辑:第一个标题行上方有一个空行)您需要修改logic@Ramankingdom尝试更新。文件是否只包含一行“FSD:”或是否会出现多次?如果“钻井数据FSD:”部分是静态的,您可以对该部分使用decimal.Parse(Substring(…).TrimEnd())
。然后循环从第4行开始的行(或第3行,如果第一个似乎为空的行已被跳过),然后取决于:列是否固定宽度(然后再次使用子字符串)或制表符分隔(然后拆分和小数。解析第一项)。如果我理解正确,对于每个输入文件,您有两个标题行,后跟N个数据行。您想要第一个标题行的描述值,以及第一个和最后一个数据行的第一列值吗?(编辑:第一个标题行上方有一个空行)您需要修改logic@Ramankingdom更新了w/a尝试。纯代码答案,解释值非常低。它们对其他有类似问题的人也没有多大帮助。建议您解释OP代码中出现问题的原因,以及您的解决方案如何解决或规避此问题。也许你也应该阅读。查看您发布的最新答案,您倾向于使用纯代码格式OK。这不是一个普遍的问题。我