C# 读取文本文件的方法
我有一个预定义的列表Wellnames=新列表{CAM1,CAM2,CAM3} 我有一个文本文件,它的格式始终与图中所示相同。如何提取/读取示例中突出显示的数字?i、 e。适用于CAM1,同样适用于CAM2和CAM3 以下是该文件的摘录:C# 读取文本文件的方法,c#,wpf,text-files,C#,Wpf,Text Files,我有一个预定义的列表Wellnames=新列表{CAM1,CAM2,CAM3} 我有一个文本文件,它的格式始终与图中所示相同。如何提取/读取示例中突出显示的数字?i、 e。适用于CAM1,同样适用于CAM2和CAM3 以下是该文件的摘录: 1------------------------------------------------------------------------------------------------------------------------------913
1------------------------------------------------------------------------------------------------------------------------------913
ALLOC Allocation/bundle report 10835.0000 Days report step 228, 1 Sep 2015
------------------------------------------------------------------------------------------------------------------------------
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Streamline | | | | | | |
| Bundle | | Surface Rate | Surface Volumes | | | |
|------------------------| Flow |-----------------------------------------------------------------------------------------------------------| Total Reservoir | Pore |PV weighted|
| Start | End | Direct | Oil | Water | Gas | Oil | Water | Gas | Rate | Volume | Pressure |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| | SM3/D | Fraction | SM3/D | Fraction | SM3/D | Fraction | SM3 | SM3 | SM3 | RM3/D | Fraction | RM3 | Bar |
| |-----------------------------------------------------------------------------------------------------------------------------------------------------------|
| CAM1 | | 9.13e-001 | | 3.14e+001 | | 9.13e-001 | | 7.55e+004 | 1.50e+005 | 7.55e+004 | 3.26e+001 | 1.06e+000 | 2.29e+005 | 6.21e+001 |
| CAM1 CAM138 | Outflow | 2.82e-001 | 3.09e-001 | 9.63e+000 | 3.07e-001 | 2.82e-001 | 3.09e-001 | 1.99e+004 | 3.88e+004 | 1.99e+004 | 1.00e+001 | 3.07e-001 | 5.96e+004 | 6.17e+001 |
| CAM1 CAM255 | Outflow | 3.34e-002 | 3.66e-002 | 3.00e+000 | 9.57e-002 | 3.34e-002 | 3.66e-002 | 1.86e+004 | 4.05e+004 | 1.86e+004 | 3.07e+000 | 9.40e-002 | 6.00e+004 | 6.30e+001 |
| CAM1 CAM177 | Outflow | 2.12e-001 | 2.32e-001 | 1.10e+001 | 3.50e-001 | 2.12e-001 | 2.32e-001 | 1.94e+004 | 3.66e+004 | 1.94e+004 | 1.13e+001 | 3.46e-001 | 5.68e+004 | 6.13e+001 |
| CAM1 CAM582 | Outflow | 3.17e-001 | 3.47e-001 | 5.72e+000 | 1.82e-001 | 3.17e-001 | 3.47e-001 | 7.77e+003 | 1.33e+004 | 7.77e+003 | 6.10e+000 | 1.87e-001 | 2.14e+004 | 6.13e+001 |
| CAM1 CAM354 | Outflow | 6.87e-002 | 7.53e-002 | 2.05e+000 | 6.53e-002 | 6.87e-002 | 7.53e-002 | 9.80e+003 | 2.04e+004 | 9.80e+003 | 2.14e+000 | 6.56e-002 | 3.07e+004 | 6.34e+001 |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
我假设你知道如何逐行读取文件。一旦字符串中有了特定的数据行,就可以对“|”字符使用Split方法。您将返回一个从零开始的数组,每个元素保存一列中的数据。在索引0处索引到数组中,并修剪该值以检查标识符CAM1等。如果它是您想要的,您可以从数组中的索引中获取其他值
考虑到严格的数据格式,这似乎是最简单的方法。我认为解决这个问题的最佳方法是使用StreamReader逐行迭代文件,然后解析出必要的信息
public dynamic Read(string file)
{
using (var streamReader = new StreamReader(File.OpenRead(file))
{
while ((var line = streamReader.ReadLine()) != null)
{
if (line.StartsWith("| CAM", StringComparison.OrdinalIgnoreCase))
{
var columns = line.Split('|').Select(x => x.Trim());
// Parse the values here, put them in a DTO
}
}
}
}
这个正则表达式可以满足您的需要
@"\|\s+CAM1\s+(\S+)\s+\|\s+\S+\s+\|\s+(\S+)\s+\|\s+\S+\s+\|\s+(\S+)\s+\|\s+\S+\s+\|\s+(\S+)"
只需更换CAM1即可满足您的需求
我给你举了个例子你试过什么吗?regex看起来是一个不错的解决方案。嗯,你似乎希望我们为你写一个完整的程序。@Jacobr365这是我面对这种工作的时候了。我正在网上学习如何阅读文本文件。基本功能,如File.Readlines等。我想知道如何解决这个问题。这里有一个提示:找到以预定义名称之一开头的行,然后根据空格和管道字符分割其余行。@Steve No我不知道,先生。我在问关于如何阅读此类文本文件的最佳方法/示例。谢谢@Ehssan我将在程序中使用您的代码片段作为参考。谢谢!!我刚刚从那个代码片段中学到了很多东西@马克西米乌克