C# 读取文本文件的方法

C# 读取文本文件的方法,c#,wpf,text-files,C#,Wpf,Text Files,我有一个预定义的列表Wellnames=新列表{CAM1,CAM2,CAM3} 我有一个文本文件,它的格式始终与图中所示相同。如何提取/读取示例中突出显示的数字?i、 e。适用于CAM1,同样适用于CAM2和CAM3 以下是该文件的摘录: 1------------------------------------------------------------------------------------------------------------------------------913

我有一个预定义的列表Wellnames=新列表{CAM1,CAM2,CAM3}

我有一个文本文件,它的格式始终与图中所示相同。如何提取/读取示例中突出显示的数字?i、 e。适用于CAM1,同样适用于CAM2和CAM3

以下是该文件的摘录:

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我将在程序中使用您的代码片段作为参考。谢谢!!我刚刚从那个代码片段中学到了很多东西@马克西米乌克