将文本文件的一个块读入一个字符串,直到某一点

本文关键字:一个 一点 字符串 文件 文本 | 更新日期: 2023-09-27 18:11:53

假设我有这样一个文本文件:

(*********************************************
  Import-Export
  Version   := v24.00
  Owner     :=
  Exported  := Wed Oct 05 09:22:48 2016
  Note:  File encoded in UTF-8.  Only edit file in a program 
         which supports UTF-8 (like Notepad, not Wordpad).
**********************************************)
IE_VER := 2.15;
CONTROLLER controllerName (ProcessorType := "1756-L71",
                           Major := 24,
                           TimeSlice := 20,
                           ShareUnusedTimeSlice := 1,
                           RedundancyEnabled := 0,
                           KeepTestEditsOnSwitchOver := 0,
                           DataTablePadPercentage := 50,
                           SecurityCode := 0,
                           ChangesToDetect := 16#ffff_ffff_ffff_ffff,
                           SFCExecutionControl := "CurrentActive",
                           SFCRestartPosition := "MostRecent",
                           SFCLastScan := "DontScan",
                           SerialNumber := 16#0000_0000,
                           MatchProjectToController := No,
                           CanUseRPIFromProducer := No,
                           InhibitAutomaticFirmwareUpdate := 0,
                           PassThroughConfiguration := EnabledWithAppend,
                           DownloadProjectDocumentationAndExtendedProperties := Yes)
    MODULE Local (Parent := "Local",
                  ParentModPortId := 1,
                  CatalogNumber := "1756-L71",
                  Vendor := 1,
                  ProductType := 14,
                  ProductCode := 92,
                  Major := 24,
                  Minor := 11,
                  PortLabel := "RxBACKPLANE",
                  ChassisSize := 10,
                  Slot := 0,
                  Mode := 2#0000_0000_0000_0001,
                  CompatibleModule := 0,
                  KeyMask := 2#0000_0000_0001_1111)
    END_MODULE
...

和"…"标记文本文件的继续。如果我想把所有东西都读入包括END_MODULE在内的字符串我该怎么做?

我的想法是:将整个文件读入字符串,通过换行符解析并创建一个do while循环将这些数组元素连接成单个字符串,直到其中一个包含"END_MODULE"但这似乎有点向后?因为我将字符串分割成一个数组然后再将它连接回一个字符串。有比我的主意更快的方法吗?

将文本文件的一个块读入一个字符串,直到某一点

如果您想逐行读取,下面是示例代码:

var builder = new StringBuilder();
using (var file = File.OpenRead("your file")) {
     using (var reader = new StreamReader(file)) {
        string line;                    
        while ((line = reader.ReadLine()) != "END_MODULE") {
            builder.AppendLine(line);
        }
     }                
 }
 string final = builder.ToString();

的好处是,你不需要读取整个文件到内存中,只有你需要的部分(这可能有助于如果你有真正大的文件)。

正如我所说,您可以使用正则表达式来实现您的目标。

使用以下表达式:.*?END_MODULE .

这样做的是,它得到了END_MODULE点之前的所有东西,但也包含了它。参见这个例子:https://regex101.com/r/AzIR4y/1

你可以这样实现:

var source = ""; //Whatever the really big file contains.
var chunk = Regex.Match(source, ".*?END_MODULE",  RegexOptions.Singleline).Groups[0].Value;

如果您的文本文件不是特别大,您可以简单地将所有文本和子字符串读取到END_MODULE:

的位置。
var contents = File.ReadAllText("$path_to_file");
var sentinel = "END_MODULE";
var idx = contents.IndexOf(sentinel);
if (idx < 0)
{
    // error
    return;
}
contents = contents.Substring(0, idx + sentinel.Length);
相关文章: