c# - Concat to end if匹配文件的前面

本文关键字:文件 前面 if Concat to end | 更新日期: 2023-09-27 18:01:31

我有一个文件,我只保留其中的一些数据。这个文件是我想添加到第二个文件末尾的文件。下面是第一个文件的样子:

147221
147486
147514-1
147502
147503
...

我想把它连接到一个文件的末尾,看起来像这样:

       some text    ... more text
text    text: Description                 
Ln      PPN PD  Qty Units   Comment MNAME   MfMCODE
                                 some comment       
1   EC5547  PCB:  SB5500 LCD DISPLAY  CTRL +RHS 1.00    EA  REV 07 OR LATER     
2   EC0303  FERRITE BEAD: 200MA 1000Z0.8 SM0603 +RHS    2.00    EA  FB2 FB4 MURATA  BLM18RK102SN1
3   EC0304  FERRITE BEAD: 2000MA 220Z0.05 SM0805 +RHS   2.00    EA  FB1 FB5 MURATA  BLM21PG221SN1
4   EC7727  IC: LTC2851 RS422 XCVR SO8 +RHS 1.00    EA  U10 LINEAR TECHNOLOGIES LTC2851CS8#PBF
                    LINEAR TECHNOLOGIES LTC2851IS8#PBF
                    MAXIM   MAX3077EASA+
                    MAXIM   MAX3077EESA+
                DNP  C20 C24 C25 C27 C44 C60 C62 J1 J5 J6 J7 J8 J11 R2 R20      
                R29 R33 R53 R54 R89 R91 R94 R96 R107 R108 R109 C63 R61      
                J12 J13 U7 TP1-20 TP22-28 TP34-36 TP38-39 TP41 TP43-54      
                TP56-96     
5   EC5071  CONN: HEADER RA 0.1x10 0.025 SQ +RHS    1.00    EQ  J2  SAMTEC  TSW-110-08-S-S-RA
...

通过匹配查看第二个文件行是否以1、2、3、4、5等开头…然后以相同的顺序添加第一个文件中的行。

我的意思是让它看起来像这样:

       some text    ... more text
text    text: Description                 
Ln      PPN PD  Qty Units   Comment MNAME   MfMCODE
                                 some comment       
1   EC5547  PCB:  SB5500 LCD DISPLAY  CTRL +RHS 1.00    EA  REV 07 OR LATER  147221
2   EC0303  FERRITE BEAD: 200MA 1000Z0.8 SM0603 +RHS    2.00    EA  FB2 FB4 MURATA  BLM18RK102SN1    147486
3   EC0304  FERRITE BEAD: 2000MA 220Z0.05 SM0805 +RHS   2.00    EA  FB1 FB5 MURATA  BLM21PG221SN1    147514-1
4   EC7727  IC: LTC2851 RS422 XCVR SO8 +RHS 1.00    EA  U10 LINEAR TECHNOLOGIES LTC2851CS8#PBF       147502
                    LINEAR TECHNOLOGIES LTC2851IS8#PBF
                    MAXIM   MAX3077EASA+
                    MAXIM   MAX3077EESA+
                DNP  C20 C24 C25 C27 C44 C60 C62 J1 J5 J6 J7 J8 J11 R2 R20      
                R29 R33 R53 R54 R89 R91 R94 R96 R107 R108 R109 C63 R61      
                J12 J13 U7 TP1-20 TP22-28 TP34-36 TP38-39 TP41 TP43-54      
                TP56-96     
5   EC5071  CONN: HEADER RA 0.1x10 0.025 SQ +RHS    1.00    EQ  J2  SAMTEC  TSW-110-08-S-S-RA        147503
.... 

思想

    现在我认为最好的方法是修剪原始文件(我已经这样做了),然后搜索第二个文件,寻找以数字开头的行。(我想用正则表达式:…@"^['d]+'s+"…)。然而,使用该正则表达式,我将只获取行上的数字,而不是整行?但是,如果我能够抓取整行(我不确定如何),如果找到该行,我会将其放在字符串中,然后将前一个文件的第一行添加到该字符串的末尾,并使用分隔符"'t"。

So much:

  • 将第一个文件修剪为连接到第二个文件末尾所需的必要数字(DONE)
  • 抓取第二个文件中的每一行(一个接一个?)
    • 检查行是否以数字开头(使用正则表达式?)
      • 如果是,将第一个文件的第一行添加到第二个文件的匹配末尾(对所有匹配都这样做)。第2行第2匹配,第3行第3匹配,等等),并将其存储为一个新字符串。(这样做的问题是,必须有一大堆字符串……我不熟悉列表…)
  • 现在回到第二个文件的每一行,并将新字符串(以第一个文件结束)与第二个文件中的每一行进行比较。如果有匹配,用字符串中的行替换该行。
  • 输出到富文本框/.txt文件。
问题

  • 我如何在第二个文件中找到以1,2,3,4,5等开头的行,然后逐行抓取第一个文件并将第一行添加到第一行。在本例中,将147221添加到以1开头的整行末尾(将147486添加到以2开头的行末尾,等等)?
  • 有人知道更简单的方法吗?

c# - Concat to end if匹配文件的前面

这将从两个输入文件中读取并写入第三个文件。关于正则表达式模式,如果一行以任何正整数(不包括零)开头,紧接着是一个空白字符(例如,像"10 some非数字文本"这样的行将是匹配的),这将工作。

using (StreamReader sr1 = new StreamReader(@"C:'Temp'Content.txt"))
using (StreamReader sr2 = new StreamReader(@"C:'Temp'Numbers.txt"))
using (StreamWriter sw = new StreamWriter(@"C:'Temp'Combined.txt"))
{
    string curLine;
    while ((curLine = sr1.ReadLine()) != null)
    {
        if (Regex.IsMatch(curLine, "^[1-9][0-9]*'s"))
        {
            sw.WriteLine(curLine + "    " + sr2.ReadLine());
        }
        else
        {
            sw.WriteLine(curLine);
        }
    }
}

假设您感兴趣的行总是以一些没有前导空格的数字开始,我只使用正则表达式来验证该行是您正在寻找的(或者甚至只是简单地检查该行的第一个字符是否是使用Char.IsDigit()的数字),然后在找到它之后进行任何处理。

using (var dataReader = File.OpenText(@"path'to'data'file"))
using (var labelReader = File.OpenText(@"path'to'label'file"))
using (var writer = File.CreateText(@"path'to'output'file"))
{
    string line;
    while ((line = dataReader.ReadLine()) != null)
    {
        if (Regex.IsMatch(line, @"^'d+"))
        {   // found the line (append label)
            writer.WriteLine(line + " " + labelReader.ReadLine());
        }
        else
        {   // not the line (pass through)
            writer.WriteLine(line);
        }
    }
}

不确定正则表达式,但你可以使用字符串函数来实现这一点,使用if-else语句,如(可能不是一个坚实的,但可以工作)

string str = "1   EC5547  PCB:  SB5500 LCD DISPLAY  CTRL +RHS 1.00    EA  REV 07 OR LATER";
        string str1 = "147221";
        if (str.StartsWith("1"))
        {
            str += str1; 
        }

输出很容易,我们可以稍后再担心。作为一种一般的方法,我会加载你的第一个文件号码到一个数组(你可以做一些列表或向量,如果你想,但我不认为这是必要的)。在解析从0开始的第二个文件时设置一个计数器。当找到想要输出的行时,使用计数器作为字符串数组的索引,按顺序获取下一个字符串。在写出数字后,增加计数器。可以在迭代时将其写回文件。类似这样的东西(没有测试过!!)这只是为了展示这个想法。)应该工作:

StringBuilder newFile = new StringBuilder();
string[] file = File.ReadAllLines(@"file2path");
foreach (string line in file)
{
    if (!regex evaluation here!)
    {
        //append your number and increment counter here
        string temp = line.Replace(oldString, appendedString);
        newFile.Append(temp + "'r'n");
        continue;
    }
    newFile.Append(line + "'r'n");
}
File.WriteAllText(@""file2path", newFile.ToString());