【发布时间】:2018-09-29 16:45:57
【问题描述】:
我有 >20MB 的文本文件,其中一些行在某些位置包含 *。因此应该从这个文件中删除与包含 * 的位置匹配的位置(例如 700670* 应该导致删除所有位置 70067000000 到 70067099999)。首先我列出要删除代码的位置是:
Parallel.ForEach(List, (pos) =>
{ if (pos.IndexOf("*") != -1)
{ var lineWithStar = pos.Substring(0, pos.IndexOf("*"));
var result = from single in List
where single.Substring(0, lineWithStar.Length) == lineWithStar
select single;
listWithPositionsToDel.AddRange(result.Skip(1).ToList());
}
});
需要很长时间才能得到结果。
我需要从输入文件中删除“123456”行 - 与 123* 匹配的所有内容。
123*
123456
1245
例如 结果应如下所示: 700204* 700205100614136* 700205100662305* 7002051006623443904 700205100667271* 700205120015472* 来源是: 700204* 700205100614136* 7002041232323234332 700205100662305* 7002051006141362332 7002051006623443904 700205100667271* 700205120015472
【问题讨论】:
-
您是如何阅读文件的?我猜它读到记忆?所以你也在内存中制作第二份副本?您最好读入行并写出新文件以替换它,并跳过写入您不想要的文件,或者逐行查看的流,然后记下最后一个 OK 行结束的位置。 . 然后找到下一个相关数据的位置并覆盖该块。
-
有文件的(小)示例吗?
-
你的解释不是很清楚。您能否向我们展示文件的一小部分、可能的输入和预期结果?
-
这个
single.Substring(0, lineWithStar.Length)不会改变整个查询。如果您想要有帮助的答案,您需要指定更多。