我的目的是读取文本文件(<50 mb)并对其执行正则表达式,然后将其保存回另一个文件(在c#中)。我如何做到这一点发布在下面。
Regex regex = new Regex(@"\s{2,}");
var lines = File.ReadLines(path);
foreach (var line in lines)
{
Console.WriteLine(regex.Split(line,2)[1]);
File.WriteAllText(regex.Split(line,2)[1]);
}
当我尝试使用小文件(140KB)时,它可以正常工作。 当我使用大小约为50 MB的文件运行相同时,它会崩溃 在循环中执行正则表达式有什么用吗?
IndexOutOfRange是抛出的异常。我无法理解的是45mb文件如何运行我的系统内存?我安装了8台RAM。
答案 0 :(得分:1)
必须有一行regex.Split(line,2)[1]
为空。添加支票
Regex regex = new Regex(@"\s{2,}");
var lines = File.ReadLines(path);
foreach (var line in lines)
{
var item = regex.Split(line,2);
if(item.Length > 1)
{
Console.WriteLine(regex.Split(line,2)[1]);
File.WriteAllText(regex.Split(line,2)[1]);
}
}
它应该有效
答案 1 :(得分:0)
IndexOutOfRange
。您的代码对Split()调用返回的数组具有数组访问权限。因此,当Split()返回一个少于2个元素的数组,使得索引1无效时,很可能会失败。请注意,Split的第二个参数只是最大分割数:没有最小值。您可能希望对输入执行其他验证,或执行类似.Last()而不是[1]的操作。
答案 2 :(得分:0)
在通过引用不正确的索引修复第一个问题之后,您将在循环中不断调用File.WriteAllText时遇到问题。这解决了这两个问题,并没有继续打开/关闭目标文件。
Regex regex = new Regex(@"\s{2,}");
File.WriteAllLines(path2,File.ReadLines(path).Select(line=>{
var items=regex.Split(line,2);
return items.Length>1?item[1]:"";
}));