尝试从字符串中捕获或分组txt到列表框C#

时间:2017-09-14 03:00:32

标签: c#

我有一个包含许多行的.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

2 个答案:

答案 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;
        }
    }
}