1

一部のデータのみを保持するためにトリミングしたファイルがあります。このファイルは、2 番目のファイルの最後に追加したいファイルです。最初のファイルは次のようになります。

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
...

2 番目のファイル行が 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
.... 

考え

  • 今のところ、これを行う最善の方法は、元のファイルをトリミングし (既に行っています)、2 番目のファイルを検索して、数字で始まる行を探すことだと思います。(正規表現でこれを行うと思います: ...@"^[\d]+\s+"...)。ただし、その正規表現を使用すると、行全体ではなく、行の番号のみを取得できますか? しかし、行全体を取得できた場合 (方法がわかりません)、その行が見つかった場合は、それを文字列に入れ、前のファイルの最初の行をその文字列の末尾に追加します。区切り文字「\t」。

かなり:

  • 最初のファイルを、2 番目のファイルの末尾に連結するために必要な数にトリムします(完了) 。
  • 2 番目のファイルの各行を取得します (1 つずつ?)
    • 行が数字で始まるかどうかを確認します(正規表現を使用していますか?)
      • 一致する場合は、最初のファイルの最初の行を 2 番目のファイルの一致の末尾に追加します (すべての一致に対してこれを行います。2 番目の一致では 2 行目、3 番目の一致では 3 行目など)、ファイルとして保存します。新しい弦。(これに関する問題は、たくさんの文字列が必要になることです...そして私はリストに慣れていません..)
  • 次に、2 番目のファイルの各行に戻り、新しい文字列 (最初のファイルの終わり) を 2 番目のファイルのすべての行と比較します。一致する場合は、その行を文字列内の行に置き換えます。
  • リッチ テキスト ボックス/.txt ファイルに出力します。

質問

  • 2 番目のファイルで 1,2,3,4,5 などで始まる行を見つけて、最初のファイルを 1 行ずつ取得し、最初の行を最初の行に追加するにはどうすればよいですか。この場合、1 で始まる行全体の末尾に 147221 を追加します (2 で始まる行の末尾に 147486 など)?
  • これを行う簡単な方法を知っている人はいますか?
4

4 に答える 4

1

関心のある行が常に先頭にスペースのない数字で始まると仮定すると、正規表現を使用して、その行が探しているものであることを確認します(または、最初の行が最初の場合は単純なチェックでもかまいません)行の文字は)を使用した数字であり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);
        }
    }
}
于 2011-07-09T15:56:41.190 に答える
1

これにより、2 つの入力ファイルから読み取られ、3 番目のファイルに書き込まれます。正規表現パターンに関しては、これは行が任意の正の整数 (ゼロを含まない) で始まり、直後に空白文字が続く場合に機能します (たとえば、「10 some non-numeric text」のような行が一致します)。

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);
        }
    }
}
于 2011-07-09T15:11:49.370 に答える
0

正規表現についてはわかりませんが、スティング関数を使用して、次のような 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; 
        }
于 2011-07-08T22:01:46.773 に答える
0

出力は簡単です。後で心配することができます。一般的なアプローチとして、最初のファイル番号を配列にロードします(必要に応じて、ある種のリストまたはベクトルを実行できますが、必要ではないと思います)。0 から始まる 2 番目のファイルを解析するときにカウンターを用意します。出力先の行が見つかったら、そのカウンターを文字列の配列のインデックスとして使用して、次の文字列を順番に取得します。数字を書き出したら、カウンターをインクリメントします。ファイルへの書き戻しは、繰り返し実行するときに実行できます。このようなもの(テストされていません!!!これはアイデアを示すためのものです。)が機能するはずです:

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());
于 2011-07-08T22:08:18.313 に答える