C# 将文本文件中的一块读到字符串中的某一点
假设我有一个文本文件:C# 将文本文件中的一块读到字符串中的某一点,c#,parsing,string-parsing,C#,Parsing,String Parsing,假设我有一个文本文件: (********************************************* 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 (lik
(*********************************************
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_模块”,我该怎么做呢
我的想法是:
将整个文件读入一个字符串,用换行符对其进行解析,并创建一个do-while循环,将这些数组元素连接成一个字符串,直到其中一个包含“END_MODULE”,但这似乎有点倒退?因为我将字符串拆分为一个数组,然后再将其连接回单个字符串。有没有比我的想法更快的方法?如果您的文本文件不是超大的,您可以简单地读取所有文本和子字符串到
结束\u模块的位置
:
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);
var contents=File.ReadAllText($path_to_File”);
var sentinel=“结束模块”;
var idx=contents.IndexOf(sentinel);
if(idx<0)
{
//错误
返回;
}
contents=contents.Substring(0,idx+sentinel.Length);
如果您的文本文件不是超大的,您只需将所有文本和子字符串读取到结束\u模块的位置即可
:
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);
var contents=File.ReadAllText($path_to_File”);
var sentinel=“结束模块”;
var idx=contents.IndexOf(sentinel);
if(idx<0)
{
//错误
返回;
}
contents=contents.Substring(0,idx+sentinel.Length);
正如我所说,您可以使用正则表达式来实现您的目标
使用以下表达式:*?结束模块
这样做的目的是,它获取所有内容,直到结束\u模块
,但也包括它。请参见此示例:
您可以这样实现:
var source = ""; //Whatever the really big file contains.
var chunk = Regex.Match(source, ".*?END_MODULE", RegexOptions.Singleline).Groups[0].Value;
正如我所说的,您可以使用正则表达式来实现您的目标 使用以下表达式:
*?结束模块
这样做的目的是,它获取所有内容,直到结束\u模块
,但也包括它。请参见此示例:
您可以这样实现:
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();
好处是您不需要将整个文件读取到内存中,只需将所需的部分读取到内存中(如果您有非常大的文件,这可能会有所帮助)。如果您希望逐行读取,下面是示例代码:
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\u MODULE”行。或者只需使用regex:
*?END\u MODULE
。不过,请确保使用单行修饰符。@Evk您能告诉我该修饰符的语法吗?一些示例代码?求你了,那真的很有帮助@这家公司有这方面的示例代码吗?对c语言还是很陌生的,所以你可以一行一行地读,直到你遇到“END_MODULE”一行。或者只使用regex:*?END_MODULE
。不过,请确保使用单行修饰符。@Evk您能告诉我该修饰符的语法吗?一些示例代码?求你了,那真的很有帮助@这家公司有这方面的示例代码吗?对c#来说还是个新手,抱歉