如何使用c#中的大文本?
我正在编辑我以前编写的一些列表,这些列表在循环中使用如何使用c#中的大文本?,c#,algorithm,text,C#,Algorithm,Text,我正在编辑我以前编写的一些列表,这些列表在循环中使用if条件,但是如果文本文件超过大约20MB它会显示溢出。如果超过1 MB,则永远加载。比如说 string[] x = File.ReadAllLines(openFileDialog1.FileName); string a = ""; for (int i = 0; i < x.Length; i++) { if (x[i].Length > 9 && x[i] < 13) {
if
条件,但是如果文本文件超过大约20MB它会显示溢出。如果超过1 MB,则永远加载。比如说
string[] x = File.ReadAllLines(openFileDialog1.FileName);
string a = "";
for (int i = 0; i < x.Length; i++)
{
if (x[i].Length > 9 && x[i] < 13)
{
a += "" + x[i] + "\r\n";
}
}
string[]x=File.ReadAllLines(openFileDialog1.FileName);
字符串a=“”;
对于(int i=0;i9&&x[i]<13)
{
a+=“+x[i]+”\r\n”;
}
}
这只是一个例子,如果你知道一个可以帮助我的主题,请发布它你应该使用BufferedStream对象来读/写更大的文件,它还可以提高执行时间
using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
string line;
while ((line = sr.ReadLine()) != null)
{
//write your logic here
}
}
更新:
通过链接以最快的方式读取文件
您应该使用BufferedStream对象来读/写更大的文件,它还可以缩短执行时间
using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
string line;
while ((line = sr.ReadLine()) != null)
{
//write your logic here
}
}
更新:
通过链接以最快的方式读取文件
从将
字符串更改为StringBuilder
开始:
string[] x = File.ReadAllLines(openFileDialog1.FileName);
StringBuilder sb = new StringBuilder();
//TODO: x[i] < 13 (taken from the question) seems to be erroneous
// Do you mean x[i].Length < 13?
for (int i = 0; i < x.Length; i++)
if (x[i].Length > 9 && x[i] < 13)
sb.AppendLine(x[i]);
string a = sb.ToString();
string[]x=File.ReadAllLines(openFileDialog1.FileName);
StringBuilder sb=新的StringBuilder();
//TODO:x[i]<13(取自问题)似乎是错误的
//你是说x[i],长度<13?
对于(int i=0;i9&&x[i]<13)
sb.AppendLine(x[i]);
字符串a=sb.ToString();
下一次尝试可以是Linq,如下所示:
string a = string.Join(Environment.NewLine, File
.ReadLines(openFileDialog1.FileName)
.Where(line => line.Length > 9 && line.Length < 13));
string a=string.Join(Environment.NewLine,文件
.ReadLines(openFileDialog1.FileName)
其中(直线=>直线长度>9和直线长度<13));
执行a+=
时,重新创建a
string
(string
是不可变的类,不能修改);在循环中重新创建字符串
看起来非常缓慢StringBuilder
是专门为此类情况设计的类。从将String
更改为StringBuilder
开始:
string[] x = File.ReadAllLines(openFileDialog1.FileName);
StringBuilder sb = new StringBuilder();
//TODO: x[i] < 13 (taken from the question) seems to be erroneous
// Do you mean x[i].Length < 13?
for (int i = 0; i < x.Length; i++)
if (x[i].Length > 9 && x[i] < 13)
sb.AppendLine(x[i]);
string a = sb.ToString();
string[]x=File.ReadAllLines(openFileDialog1.FileName);
StringBuilder sb=新的StringBuilder();
//TODO:x[i]<13(取自问题)似乎是错误的
//你是说x[i],长度<13?
对于(int i=0;i9&&x[i]<13)
sb.AppendLine(x[i]);
字符串a=sb.ToString();
下一次尝试可以是Linq,如下所示:
string a = string.Join(Environment.NewLine, File
.ReadLines(openFileDialog1.FileName)
.Where(line => line.Length > 9 && line.Length < 13));
string a=string.Join(Environment.NewLine,文件
.ReadLines(openFileDialog1.FileName)
其中(直线=>直线长度>9和直线长度<13));
执行a+=
时,重新创建a
string
(string
是不可变的类,不能修改);在循环中重新创建字符串
看起来非常缓慢StringBuilder
是专门为这种情况设计的类。虽然缓冲流在很多情况下都是有意义的(我不知道它在这种特定情况下有多大帮助——基于磁盘的IO已经缓冲),但解决这个问题的主要方法是每次读取一行。所以我建议把这作为回答的重点。@LarsMøllebjerg你是对的。在这里,我为处理更大的文件编写了工作代码。我很高兴我提出了两个让我的生活更轻松的新想法^^^^而缓冲流在很多情况下肯定是有意义的(我不知道在这种特定情况下它有多大帮助-基于磁盘的IO已经缓冲了),解决他的问题的主要方法是你一次读一行。所以我建议把这作为回答的重点。@LarsMøllebjerg你是对的。在这里,我为处理更大的文件编写了工作代码。我很高兴我提出了两个让我的生活更轻松的新想法^^