我有一个包含许多行的.txt文件。我试图只捕获以D开头的行。但这里有诀窍:我想用它捕获2行进行(当D行开始时)所以我可以捕获它来自哪个站点和程序。这就是我要找的东西
期望的结果: ![所需文字] [1]
此外,D行可以在文本中出现多次,长度不同,因此不是3行" D"可能有1000或10或者你得到它..
我如何写这个,这可以吗? anel系统名称:BAUER Node 02 程序名称:ABU.DEH1LR.PGM 面板系统名称:BAUER Node 02 程序名称:ABU.RT1LR.PGM 面板系统名称:BAUER Node 02 程序名称:ABU.RT2LR.PGM 面板系统名称:BAUER Node 02 程序名称:ABU.RT3LR.PGM 面板系统名称:BAUER Node 03 程序名称:ABA.LIGHTING.PGM 面板系统名称:BAUER Node 03 程序名称:ABA.RT1LR.PGM 面板系统名称:BAUER Node 03 程序名称:ABA.RT2LR.PGM D 5205 LOOP(128%X%SAT%X%VRT%X%SAS 1000 15 0 1 0 0 100 0) D 5210 DBSWIT(0 ABA.RT2LR.HCO 2.0 8.0 ABA.RT2LR.HT1) D 5220表(ABA.RT2LR.VRT%X%HCO 0 0 100 100) 面板系统名称:BAUER Node 03 程序名称:ABA.RT3LR.PGM 面板系统名称:BAUER Node 03 程序名称:ABA.ZONE.VLV.PGM 面板系统名称:BAUER Node 03 程序名称:ABU.CAR.PLUG.PGM 面板系统名称:BAUER Node 04 程序名称:ABA.RT4LR.PGM 面板系统名称:BAUER Node 04 程序名称:BAUERBUSH PPCL 4 面板系统名称:BAUER Node 05 程序名称:ABA.DEH1LR.PGM 面板系统名称:BAUER Node 06 程序名称:ABA.RT5LR.PGM
enter code here
答案 0 :(得分:0)
保留前两行的缓冲区。
这是一个直接输入到回复窗口并且未经测试的示例,因此可能存在多个错误,但仍会在概念上显示您需要执行的操作:
bool bufferready = false;
string prev1="", prev2="";
StringBuilder result = new StringBuilder();
foreach (string line in File.ReadLines("path"))
{
if (line.StartsWith("D"))
{
if (bufferready)
{
result.AppendLine(prev1);
result.AppendLine(prev2);
prev1 = "";
prev2 = "";
bufferready = false;
}
result.AppendLine(line);
}
else
{
prev1 = prev2;
prev2 = line;
bufferready = true;
}
}
如果你提供了样本数据作为文本,而不是图像,我会首先在Visual Studio中尝试这一点并在发布之前清除所有错误。
答案 1 :(得分:0)
将ListBox(Name:MainListBox)和Button(Name:GetTextButton)添加到Windows Form App 并使用此代码隐藏:
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
namespace StackAnswer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void GetTextButton_Click(object sender, System.EventArgs e)
{
var source = File.ReadAllLines("C:\\Users\\User\\Desktop\\Test.txt");
MainListBox.Items.Clear();
List<string> result = new List<string>();
for (int i = 0; i < source.Length; i++)
{
if (source[i].StartsWith("D")
&& !source[i - 1].StartsWith("D"))
{
result.Add(source[i - 2]);
result.Add(source[i - 1]);
result.Add(source[i]);
}
else if (source[i].StartsWith("D"))
{
result.Add(source[i]);
}
}
MainListBox.Items.AddRange(result.ToArray());
}
}
}
WPF版:
<Window x:Class="StackAnswerWPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:StackAnswerWPF" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="283*" />
<RowDefinition Height="37*" />
</Grid.RowDefinitions>
<ListBox Name="MainListBox" />
<Button Name="GetTextButton" Grid.Row="1" Click="GetText">GetText</Button>
</Grid>
</Window>
代码隐藏:
using System.Collections.Generic;
using System.IO;
using System.Windows;
namespace StackAnswerWPF
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void GetText(object sender, RoutedEventArgs e)
{
var source = File.ReadAllLines("C:\\Users\\User\\Desktop\\Test.txt");
MainListBox.ItemsSource = null;
List<string> result = new List<string>();
for (int i = 0; i < source.Length; i++)
{
if (source[i].StartsWith("D")
&& !source[i - 1].StartsWith("D"))
{
result.Add(source[i - 2]);
result.Add(source[i - 1]);
result.Add(source[i]);
}
else if (source[i].StartsWith("D"))
{
result.Add(source[i]);
}
}
MainListBox.ItemsSource = result;
}
}
}