将一段文本文件中的某个点读入一个字符串
read in a chunk of a text file up to a certain point into a string
假设我有这个文本文件:
(*********************************************
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" 但这似乎有点倒退?因为我将字符串拆分为一个数组,然后再次将其连接回单个字符串。有没有比我的想法更快的方法?
如果您的文本文件不是很大,您可以简单地读取所有文本和子字符串到 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);
正如我所说,您可以使用正则表达式来实现您的目标。
使用以下表达式:.*?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;
如果要逐行阅读,这里是示例代码:
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();
好处是您无需将整个文件读入内存,只需将您需要的部分读入内存(如果您的文件非常大,这可能会有所帮助)。
假设我有这个文本文件:
(*********************************************
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" 但这似乎有点倒退?因为我将字符串拆分为一个数组,然后再次将其连接回单个字符串。有没有比我的想法更快的方法?
如果您的文本文件不是很大,您可以简单地读取所有文本和子字符串到 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);
正如我所说,您可以使用正则表达式来实现您的目标。
使用以下表达式:.*?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;
如果要逐行阅读,这里是示例代码:
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();
好处是您无需将整个文件读入内存,只需将您需要的部分读入内存(如果您的文件非常大,这可能会有所帮助)。