所以,让我说我有这个文本文件:
(*********************************************
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"但这似乎有点倒退?因为我将字符串拆分成一个数组,然后再将它连接回一个字符串。有没有比我的想法更快的方式?
答案 0 :(得分:2)
如果您想逐行阅读,请参阅示例代码:
std::ostream
好处是您不会将整个文件读入内存,只读取您需要的部分(如果您的文件非常大,可能会有所帮助)。
答案 1 :(得分:1)
正如我所说,你可以使用正则表达式来实现你的目标。
使用以下表达式:.*?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;
答案 2 :(得分:0)
如果您的文本文件不是超大,您只需将所有文本和子字符串读取到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);