我尝试取2个txt文件并将file1 concat中每一行的行与file2中的每一行合并
实施例: 文件1:
a
b
file2的:
c
d
结果:
a c
a d
b c
b d
这是代码:
{
//int counter = 0;
string[] lines1 = File.ReadLines("e:\\1.txt").ToArray();
string[] lines2 = File.ReadLines("e:\\2.txt").ToArray();
int len1 = lines1.Length;
int len2 = lines2.Length;
string[] names = new string[len1 * len2];
int i = 0;
int finish = 0;
//Console.WriteLine("Check this");
for (i = 0; i < lines2.Length; i++)
{
for (int j = 0; j < lines1.Length; j++)
{
names[finish] = lines2[i] + ' ' + lines1[j];
finish++;
}
}
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"E:\text.txt"))
{
foreach (string line in names)
{
// If the line doesn't contain the word 'Second', write the line to the file.
file.WriteLine(line);
}
}
}
我得到了这个例外:
“发生了'System.OutOfMemoryException'类型的未处理异常 在ConsoleApplication2.exe中“在这一行:
string [] names = new string [len1 * len2];
是否有其他方法可以合并这2个文件而不会出现OutOfMemoryException?
答案 0 :(得分:2)
类似
using (var output = new StreamWriter(@"E:\text.txt"))
{
foreach(var line1 in File.ReadLines("e:\\1.txt"))
{
foreach(var line2 in File.ReadLines("e:\\2.txt"))
{
output.WriteLine("{0} {1}", line1, line2);
}
}
}
除非行很长,否则应该避免使用OutOfMemoryException
。
答案 1 :(得分:1)
看起来你想要一个笛卡尔积而不是串联。不要将所有行加载到内存中,而是将ReadLines
与SelectMany
一起使用,这可能不会很快但会避免异常:
var file1 = File.ReadLines("e:\\1.txt");
var file2 = File.ReadLines("e:\\2.txt");
var lines = file1.SelectMany(x => file2.Select(y => string.Join(" ", x, y));
File.WriteAllLines("output.txt", lines);
答案 2 :(得分:0)
使用StringBuilder实例而不是连接字符串。字符串在.Net中是不可变的,因此对任何实例的每次更改都会创建一个新的,消耗可用的内存。 使名称成为StringBuilder []名称,并使用Append方法构造结果。
答案 3 :(得分:0)
如果您的文件很大(这是内存不足的原因),您不应该(从不)将完整的文件加载到内存中。特别是结果文件(size = size1 * size2)会变得非常大。 我建议使用StreamReader逐行读取输入文件 使用StreamWriter逐行编写结果文件。
使用这种技术,您可以处理大型文件(只要结果适合您的硬盘)
答案 4 :(得分:-1)
使用stringbuilder而不是通过&#34; +&#34;
附加答案 5 :(得分:-1)
使用“列表名称”和“添加”组合行到列表。 所以你不需要分配内存。