2017-07-22 5 views
0

私は大きなtxtファイル(22k行、長さ:1.4mio)を持っており、各ブロックを抽出して特別な単語をスキャンする必要があります。これに応じて、私はこのブロックの "タイトル"を変更する必要があります。私は仕事をする正規表現を持っていますが、それはこの行の量で非常に遅いです。ブロックは複数行を超えているので、単一行、複数行およびグローバル: c#大きなtxtファイルをフィルタリングする方法

https://regex101.com/r/wN6nB7/24

私はフラグを必要としていました。

すべてのブロックはT; N ;;; ...で始まり、A; N ;; ...;で終わります。

ブロックがテキスト "Tyton"に含まれている場合は、これをA; N;

前:

A;N;400.20;40;NATURAL Muffendruckrohre aus duktilem;Gußeisen;1;0;m;2580;5;0;400.20;

後:

A;N;400.20;40;NATURAL Muffendruckrohre aus duktilem;Gußeisen Tyton;1;0;m;2580;5;0;400.20;

は何その内容によってブロックを操作するための良い方法でしょうか? 私は適切な解決策を見つけようとしました。

私の考え方は以下のとおりであった: 1.抽出し、各ブロック 2.編集A; N;タイトル 3.書き込みだけ編集したA; N; IDに基づいたタイトル。

本日発見されたリストにはIDが重複しています... 誰でも助けてくれることを願っています。私の脳..私は泣いています。

Edit1:入力の例と私が編集する必要があるグループが追加されました。

+0

入力と出力の簡単な例を提供できますか? – Jonas

+0

http://www.filehelpers.net/example/Advanced/MultiRecordEngine/を見てください。その種の仕事についてRegExの使用をやめてください。 –

+0

あなたは22k行を言います。 22k行を意味しますか? 'ブロック 'とは何ですか?各行はブロックであるか、ブロックは複数の行である可能性がありますか? – pookie

答えて

0

Finaly私は仕事にそれを持って来ることができました4日後に...原因イムそれは、C#に精通し、私はかなり初心者ですません...

私はそれはまだ多くのことを縫い目原因たかったです質問...

<--BeginOfFirstBlock 
T;N;400.20;;1;;nach DIN EN 545, mit;2;;Steckmuffenverbindung Tyton, innen mit; 
T;N;400.20;;3;;Zementmörtelauskleidung, außen;4;;BioZinalium bestehend aus; 
T;N;400.20;;5;;Zink-Aluminium-Legierung (ZnAl 85-15);6;;mit Kupfer (Cu) angereichert,; 
T;N;400.20;;7;;flächenbezogene Masse von mind. 400;8;;g/m² NOVO.SIT und blaue; 
T;N;400.20;;9;;AQUACOAT-Deckbeschichtung, Baulänge 6;10;;m, Gussrohre für Wasser, NATURAL; 
T;N;400.20;;11;;Muffendruckrohr Tyton, DN: 80,;12;;Druckklasse : C50, d1: 98, Gewicht; 
T;N;400.20;;13;;(kg) pro 1 m: 12,5;;;;; 
A;N;400.20;40;NATURAL Muffendruckrohre aus duktilem;Gußeisen Tyton DN 80;1;0;m;2580;5;0;400.20; <-- ThisHasToBeEditedBasedOnBlock1NeededWordMatches 
<-- EndOfFirstBlock 
<-- StartOfSecondBlock 
T;N;405.20;;1;;nach DIN EN 545, mit;2;;Steckmuffenverbindung Tyton, innen mit; 
T;N;405.20;;3;;Zementmörtelauskleidung, außen;4;;BioZinalium bestehend aus; 
T;N;405.20;;5;;Zink-Aluminium-Legierung (ZnAl 85-15);6;;mit Kupfer (Cu) angereichert,; 
T;N;405.20;;7;;flächenbezogene Masse von mind. 400;8;;g/m² und blaue; 
T;N;405.20;;9;;AQUACOAT-Deckbeschichtung, Baulänge 6;10;;m, Gussrohre für Wasser, NATURAL; 
T;N;405.20;;11;;Muffendruckrohr Tyton, DN: 100,;12;;Druckklasse : C50, d1: 118, Gewicht; 
T;N;405.20;;13;;(kg) pro 1 m: 15,2;;;;; 
A;N;405.20;40;NATURAL Muffendruckrohre aus duktilem;Gußeisen Tyton DN 100;1;0;m;2470;5;0;405.20; <-- ThisHasToBeEditedBasedOnBlock2NeededWordMatches 
<-- EndOfSecondBlock 
AndSoOn... 

は今..私は..リストに、[]の文字列に辞書をすべてのブロックを保存するためにしようと試みたというように..私はそれを保存いけないが、RAMに即座にそれを編集することでも試してみましたしかし、うまくいきませんでした... 今私はFile.ReadAllLinesといくつかのifとforeachで試しました。この縫い目はこれまでのところ作動し、現在は300msしか必要ありません。それがうまくいかなかった理由はまだ分かりません。デバッグモードで永久に実行されていました。 はとにかく..私のnoobの方法は、今のようになります。

string[] ipt2 = File.ReadAllLines(input, Encoding.Default); 
    HashSet<string> matches = new HashSet<string>(); 
    List<string> dnMatches = new List<string>(); 

    string[] patHighMatch = new string[] { @"Tyton(?!.*\bSIT\b)(?!.*\bPLUS\b)", @"\bNOVO.SIT\b" }; 

    for (int i = 0; i < ipt2.Length; i++) // Geht Zeile für Zeile durch 
    { 
     if (ipt2[i].StartsWith("T;N;")) // Überprüft die Zeile nur wenn die Zeile mit T;N; anfängt 
      foreach (var match in patHighMatch) // Geht alle pattern`s im StringArray durch 
      { 
       Match Match = Regex.Match(ipt2[i], match, RegexOptions.IgnoreCase); 
       if (Match.Success) 
        matches.Add(Match.Groups[0].ToString()); 
      } 

     if (matches.Count != 1 && ipt2[i].StartsWith("T;N;")) 
     { 
      string[] patLowMatch = new string[] { @"\bTyton.SIT.PLUS\b", @"\bTIS.K\b", @"\bSteckmuffenverbindung[^-]\bSTANDARD\b[^-]", @"[^-]\bSTANDARD\bVI\b[^-]" }; 
      foreach (var match in patLowMatch) 
      { 
       Match Match = Regex.Match(ipt2[i], match, RegexOptions.IgnoreCase); 
       if (Match.Success) 
        matches.Add(match); 
      } 
     } 
     if (matches.Count > 0 && ipt2[i].StartsWith("A;N;")) 
     { 
      ipt2[i] = ipt2[i].Replace("Tyton",String.Join(" ",matches)); // ReplaceTest 
      // ipt2[i] = ipt2[i].Replace("Tag", "DONEEE!"); 
      // Console.WriteLine(ipt2[i].ToString()); 
      matches.Clear(); 
      replaces++; 
     } 
    } 

は今、私は正規表現についての唯一の2最後の質問を持っているが、これは右の場所ではありません...とにかく私は、実際の作業環境で私のプログラムを試してみて下さい。とにかく試してみるとタイ。

関連する問題