C# 如何从一个文本中写入多个文本文件
我有一个像“ddd,aaa,bb,cccc,3”这样的文本文件。这篇课文有一百万行。我把所有单词都放在数组中。比如说C# 如何从一个文本中写入多个文本文件,c#,forms,filestream,C#,Forms,Filestream,我有一个像“ddd,aaa,bb,cccc,3”这样的文本文件。这篇课文有一百万行。我把所有单词都放在数组中。比如说 value1=ddd, value2=aaa , value3=bbb , value4=cccc, value5=3`. 它应该是不同的算法,但这并不重要 阅读本文时,取最后一个数字3,并重复第一条记录三次,因为最后一个数字是3。如果最后一个数字应该是4,那么它将重复四次。它给出了这样的新行号 1,aa,bb,ccc,ddd,3 2,aa,bb,ccc,ddd,3 3,aa
value1=ddd, value2=aaa , value3=bbb , value4=cccc, value5=3`.
它应该是不同的算法,但这并不重要
阅读本文时,取最后一个数字3
,并重复第一条记录三次,因为最后一个数字是3。如果最后一个数字应该是4,那么它将重复四次。它给出了这样的新行号
1,aa,bb,ccc,ddd,3
2,aa,bb,ccc,ddd,3
3,aa,bb,ccc,ddd,3
现在我想,当这个行数等于10000时,它必须写新的文本。例如,如果我的阅读文本有50000条记录,它必须写5条。文本文件。我该怎么做呢。你能帮我吗
这是写方法
public void Save()
{
value1.Remove("SE");
value2.Remove("CS");
value3.Remove("NAME");
value4.Remove("SURNAME");
value5.Remove("Number");
int rowNum = 1;
int maxNum = 1000;
String aa = "";
String TMPvalue;
for (int d = 0; d < value5.Count; d++)
{
for (int m = 0; m < (Int32)value5[d]; m++,rowNum++)
{
TMPvalue = rowNum + "," + value1[d] + "," + value2[d] + "," + value3[d] + "," + value4[d] + "," + "TEB";
aa = aa + TMPvalue + "\n";
if(rowNum==maxNum){
path = path + Convert.ToString(xnum) + ".txt";
file1 = new System.IO.StreamWriter(path);
aa = "ROWNUM,v1,v2,v3,v4" + "\n\r" + aa;
string[] lines = aa.Split('\n');
foreach (string s in lines)
{
file1.WriteLine(s);
}
file1.close();
rowNum=1;
aa = "";
}
}
}
file2 = new System.IO.StreamWriter(path);
aa = "ROWNUM,v1,v2,v3,v4" + "\n\r" + aa;
string[] lines = aa.Split('\n');
foreach (string s in lines)
{
file2.WriteLine(s);
}
file2.close()
}
public void Save()
{
价值1.移除(“SE”);
价值2.移除(“CS”);
价值3.删除(“名称”);
价值4.删除(“姓氏”);
价值5.删除(“编号”);
int rowNum=1;
int maxNum=1000;
字符串aa=“”;
字符串TMPvalue;
对于(int d=0;d
您可以使用下面的LINQ查询,该查询应该执行您想要的操作:
var lines10kGroups = File.ReadLines(@"C:\Temp\File.txt")
.Select(l => new { Line = l, Fields = l.Split(',') })
.Where(x => x.Fields.Length > 1)
.Select(x => new{ LastToken = x.Fields.Last().Trim().Split('=').Last(), x.Fields, x.Line})
.Where(x => x.LastToken.All(Char.IsDigit)) // checks if all characters are digits, pre-check for int.Parse
.Select(x => new { Count = int.Parse(x.LastToken), x.Line, x.Fields })
.SelectMany(x => Enumerable.Repeat(x.Line, x.Count)) // this repeats count-lines
.Select((line, index) => new{ line, index })
.GroupBy(x => x.index / 10000); // integer division trick to group by 10k lines
string targetDir = @"C:\Temp\TestDirectory";
Directory.CreateDirectory(targetDir);
int fileNum = 0;
foreach (var lineGroup in lines10kGroups)
{
string path = Path.Combine(targetDir, string.Format("File_{0}.txt", ++fileNum));
while(File.Exists(path))
path = Path.Combine(targetDir, string.Format("File_{0}.txt", ++fileNum));
File.WriteAllLines(path, lineGroup.Select(x => x.line));
}
您需要关闭旧文件并打开新文件。这里的奥秘是什么?当我添加关闭和打开文件时。它不读写。使用块将您的
StreamWriter
封装在中。当程序在调试状态下运行时,如果它处于“if”状态,它将再次循环。因此,请编写这么多文件。@19052013也许您应该向我们展示有问题的代码。这显然不会关闭文件,因此它不可能是正确的-1代码性能对我来说很重要。我必须改变这个代码的读取算法。我无法实现此代码:(@19052013:性能应该很好。我已使用5MB示例文件对其进行了测试,该文件包含以2到10之间的数字结尾的行(因此每行重复2到10行)创建40k个文件只花了32秒:持续时间:00:00:32.0788782个文件:39578行总数:395772
@19052013-你为什么认为这太慢了?非常感谢,但我必须在读取代码时使用arraylist。这是格式。我无法更改。我想你已经用你的Linq fu淹没了操作。