我有一个很大的txt文件(22k行;长度:1.4mio),我必须提取每个块才能扫描它以获取特殊字。根据这个,我必须修改这个块的“标题”。我得到了一个正则表达式,但是这行数量很慢。
https://regex101.com/r/wN6nB7/24
我需要标记:SingleLine,MultiLine和Global,因为块是多行的。
每个块以T; N ;;; ...开头,以A; N ;; ...;
结束如果Block中包含文本“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 :(得分:0)
最后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...
现在..我试图将每个块保存到字符串[],List,Dictionary ..等等..我甚至试图不保存但是在RAM中立即编辑它但是没有工作......
现在我尝试使用File.ReadAllLines
和一些if和foreach。这个接缝到目前为止工作,它现在只需要300毫秒。仍然无法理解为什么它不起作用。它一直在调试模式下运行。
无论如何..我的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个关于RegEx的问题,但这不是正确的地方..无论如何,我必须在真实的工作环境中尝试我的程序。 Ty无论如何都要尝试。