Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从一个文本中写入多个文本文件_C#_Forms_Filestream - Fatal编程技术网

C# 如何从一个文本中写入多个文本文件

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

我有一个像“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,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淹没了操作。