C# 使用正则表达式删除不一致文本文件中的额外字母集

C# 使用正则表达式删除不一致文本文件中的额外字母集,c#,regex,C#,Regex,我很难想出如何使用正则表达式删除多余的字母 我下面有一个例子,它说每行有42个“|”(垂直条) |V.7|42| 1|0|1|58|4|4|351|25|8|||1|0||6|3|1000|49|20|430|17|6|0|10|0|1200|25||30|20|20|20|20|0|100|61028|1|0|0|1|1|0| 1|0|1|58|4|4|351|25|8|||1|0||6|3|1000|49|20|430|17|6|0|10|0|1200|25||30|20|20|20|20|

我很难想出如何使用正则表达式删除多余的字母

我下面有一个例子,它说每行有42个“|”(垂直条)

|V.7|42|
1|0|1|58|4|4|351|25|8|||1|0||6|3|1000|49|20|430|17|6|0|10|0|1200|25||30|20|20|20|20|0|100|61028|1|0|0|1|1|0|
1|0|1|58|4|4|351|25|8|||1|0||6|3|1000|49|20|430|17|6|0|10|0|1200|25||30|20|20|20|20|0|100|61028|1|0|0|1|1|0|
2|543|2|58|4|4|366|26|9|100||2|200||8|3|1000|49|20|430|17|6|10|21|54|2400|36||30|20|20|20|20|543|150|61028|2|100|1|2|2|0|
3|1230|3|60|5|5|390|26|10|100||3|1500||10|3|1000|49|20|430|17|6|10|32|123|4800|46||30|20|20|20|20|1230|200|61028|3|1000|2|3|3|0|
4|2002|4|61|6|6|424|27|12|100||4|6000||12|4|769|37|15|315|12|4|10|45|200|9600|57||30|20|20|20|20|2002|250|61028|4|5000|3|4|4|0|
5|3306|5|63|7|7|468|29|14|100||5|18000||16|4|556|27|11|208|8|2|10|58|331||69||30|20|20|20|20|3306|300|61027|1|10000|4|5|5|0|
6|4950|6|66|8|8|522|31|17|100||6|||18|4|435|21|9|147|6|1|10|74|495||80||30|20|20|20|20|4950|350|61027|2|30000|5|6|6|0|
7|6947|7|69|10|10|585|33|20|100||7|||20|4|333|17|7|97|4|1|10|90|695||92||20|15|15|15|15|6947|400|61027|3|50000|6|7|7|0|
8|9309|8|73|12|12|658|35|24|100||8|||24|4|286|14|6|73|3|1|10|109|931||105||20|15|15|15|15|9309|450|61026|1|100000|7|8|8|0|
9|12050|9|77|14|14|741|38|28|100||9|||27|5|250|13|5|55|3|1|10|129|1205||117||20|15|15|15|15|12050|500|61026|2|300000|8|9|9|0|
10|15183|10|82|16|16|834|41|33|100|100|10|||29|5|222|11|4|0|0|0|10|151|1366||130|5|20|15|15|15|15|15183|550|61025|1|500000|9|10|10|0|
11|18720|11|87|19|19|936|45|38|100|100|11|||31|5|200|10|4|0|0|0|11|176|1685||143|10|20|15|15|15|15|18720|600|||||||0|
12|21335|12|92|22|22|1048|48|44|100|100|12|||36|5|182|9|4|0|0|0|12|203|2134||157|15|10|15|10|10|10|21335|650|||||||0|
现在我有另一个45,我想要的是删除新的字母,这样它有42个垂直条,就像上面一样

|V.8|45|
1|0|1|58|4|4|351|25|8|||1|0||6|3|1000|49|20|430|17|6|0|10|0|1200|25||30|20|20|20|20|0|100|61028|1|0|0|1|1|0|5000|40022|1|
2|543|2|58|4|4|366|26|9|100||2|200||8|3|1000|49|20|430|17|6|10|21|54|2400|36||30|20|20|20|20|543|150|61028|2|100|1|2|2|0|25000|61034|1|
3|1230|3|60|5|5|390|26|10|100||3|1500||10|3|1000|49|20|430|17|6|10|32|123|4800|46||30|20|20|20|20|1230|200|61028|3|1000|2|3|3|0|75000|40250|1|
4|2002|4|61|6|6|424|27|12|100||4|6000||12|4|769|37|15|315|12|4|10|45|200|9600|57||30|20|20|20|20|2002|250|61028|4|5000|3|4|4|0|160000|61035|1|
5|3306|5|63|7|7|468|29|14|100||5|18000||16|4|556|27|11|208|8|2|10|58|331||69||30|20|20|20|20|3306|300|61027|1|10000|4|5|5|0|300000|40355|3|
6|4950|6|66|8|8|522|31|17|100||6|||18|4|435|21|9|147|6|1|10|74|495||80||30|20|20|20|20|4950|350|61027|2|30000|5|6|6|0||||
7|6947|7|69|10|10|585|33|20|100||7|||20|4|333|17|7|97|4|1|10|90|695||92||20|15|15|15|15|6947|400|61027|3|50000|6|7|7|0||||
8|9309|8|73|12|12|658|35|24|100||8|||24|4|286|14|6|73|3|1|10|109|931||105||20|15|15|15|15|9309|450|61026|1|100000|7|8|8|0||||
9|12050|9|77|14|14|741|38|28|100||9|||27|5|250|13|5|55|3|1|10|129|1205||117||20|15|15|15|15|12050|500|61026|2|300000|8|9|9|0||||
10|15183|10|82|16|16|834|41|33|100|100|10|||29|5|222|11|4|0|0|0|10|151|1366||130|5|20|15|15|15|15|15183|550|61025|1|500000|9|10|10|0||||
11|18720|11|87|19|19|936|45|38|100|100|11|||31|5|200|10|4|0|0|0|11|176|1685||143|10|20|15|15|15|15|18720|600|||||||0||||
12|21335|12|92|22|22|1048|48|44|100|100|12|||36|5|182|9|4|0|0|0|12|203|2134||157|15|10|15|10|10|10|21335|650|||||||0||||
我现在有这个代码:

public string Fix(string FileName, int columnsCount)
{
    var InputFile = File.ReadLines(FileName).Skip(1).ToArray();
    string Result = "";
    for(int i = 0; i < InputFile.Length; i++)
    {
        int FoundMatches = Regex.Matches(Regex.Escape(InputFile[i]), FindWhatTxtBox.Text).Count;
        // If too many letters found, trim the rest.
        if(FoundMatches > CountTxtBox.Text.Length)
        {
            string CurrentLine = InputFile[i];
        }
    }
    return Result;
}
公共字符串修复(字符串文件名,int-columnsunt)
{
var InputFile=File.ReadLines(文件名).Skip(1).ToArray();
字符串结果=”;
for(int i=0;iCountTxtBox.Text.Length)
{
字符串CurrentLine=InputFile[i];
}
}
返回结果;
}

正如您所看到的,每条线的垂直条内要么有一个数字,要么没有数字。如何删除多余的字母?

您必须使用正则表达式吗?也可以通过如下方式进行字符串操作:

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
        string s = "1|0|1|58|4|4|351|25|8|||1|0||6|3|1000|49|20|430|17|6|0|10|0|1200|25||30|20|20|20|20|0|100|61028|1|0|0|1|1|0|5000|40022|1|";
        var arr = s.Split('|') ;            
        var retVal = String.Join("|", arr.Take(43));

        Console.WriteLine(retVal);
    }
}

它需要43,因为第一个数字对我来说似乎是一个计数器。。。但你当然可以做到42。注意,如果要使用的条目少于43个,则此代码将失败。

太简单,无法使用正则表达式。见下面的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string INPUT_FILENAME = @"c:\temp\test.txt";
        const string OUTPUT_FILENAME = @"c:\temp\test1.txt";
        static void Main(string[] args)
        {
            StreamReader reader = new StreamReader(INPUT_FILENAME);
            StreamWriter writer = new StreamWriter(OUTPUT_FILENAME);
            string inputLine = "";
            int lineCount = 0;
            while ((inputLine = reader.ReadLine()) != null)
            {
                if (++lineCount == 1)
                {
                    writer.WriteLine(inputLine);
                }
                else
                {
                    string[] inputArray = inputLine.Split(new char[] {'|'});
                    writer.WriteLine(string.Join("|", inputArray.Take(43)));
                }
            }
            reader.Close();
            writer.Flush();
            writer.Close();
        }
    }
}

这是一个数据文件,让我们只需要5个项目,但仍然使用正则表达式来保持简单。 为StackOverflow保留小的例子…一个会得到更多的答案

下面的代码可以根据需要更改为42(
{0,42}
)或任何数字,但示例将读取,然后仅写出5

数据文件

1|2|3|4|5|6|7|8|9|10
10|9|8|7|6|5|4|3|2|1|0|1|
||||||||||||11|12|
1|2|3|4|5|
10|9|8|7|6|
|||||
每行获取0到5个项目的代码

var data = File.ReadAllText(@"C:\Temp\test.txt");

string pattern = @"^(\d*\|){0,5}";

File.WriteAllLines(@"C:\Temp\testOut.txt",
                    Regex.Matches(data, pattern, RegexOptions.Multiline)
                         .OfType<Match>()
                         .Select(mt => mt.Groups[0].Value));

你不应该需要一个循环。您可以用“$1”替换类似“^((?:\d*\\\\){42})。*”的内容谢谢你的回答,法特芬格斯。示例代码是什么样子的?Microsoft在这里提供了一些不错的示例代码。这帮了我很多忙!非常感谢你,jdweng!谢谢大家帮助我,但我选择了这个,因为它简化了很多事情。我已经有一段时间没有编程了,也没有研究过正则表达式,所以我对它比较陌生。再次感谢你!