如何将一个文本文件分割成多个文件?

6
在C#中,将文本文件拆分成多个文本文件(拆分分隔符为一个空行)并保留字符编码的最有效方法是什么?

1
你的标题和实际问题不同。你想知道如何分割文本文件(标题),还是如何更有效地进行操作(问题)? - Arseni Mourzenko
我需要两者兼备。以最有效的方式拆分文本文件! - GPX
3个回答

9
我会使用StreamReader和StreamWriter类:
 public void Split(string inputfile, string outputfilesformat) {
     int i = 0;
     System.IO.StreamWriter outfile = null;
     string line; 

     try {
          using(var infile = new System.IO.StreamReader(inputfile)) {
               while(!infile.EndOfStream){
                   line = infile.ReadLine();
                   if(string.IsNullOrEmpty(line)) {
                       if(outfile != null) {
                           outfile.Dispose();
                           outfile = null;
                       }
                       continue;
                   }
                   if(outfile == null) {
                       outfile = new System.IO.StreamWriter(
                           string.Format(outputfilesformat, i++),
                           false,
                           infile.CurrentEncoding);
                   }
                   outfile.WriteLine(line);
               }

          }
     } finally {
          if(outfile != null)
               outfile.Dispose();
     }
 }

您可以像这样调用此方法:
 Split("C:\\somefile.txt", "C:\\output-files-{0}.txt");

+1,但我想知道一个空行是否可以具有System.Environment.NewLine的值,而不是null或空字符串。 - Jeff Ogata
@adrift:System.Environment.NewLine 不是会被添加到每行的末尾(或开头)吗? - GPX
文本文件中的“空行”始终只是 \r\n(或基于操作系统的变体),否则你怎么检测它?文本文件只是字符流而已。 - Pavel Urbančík
ReadLine() 方法会一直读取到换行符,所以结果不会包含它们。此外,我从未遇到过非规范化的行尾(即混合使用 \r\n、\n、\r 和 \n\r),但您可以很容易地测试一下。 - Andy Edinborough
安迪的方法对我似乎有效。我将在大文件上运行一些测试,并很快发布结果! - GPX

0

仅适用于那些想避免思考的人:

如果您有一个 CSV (逗号分隔值)文件,并且希望在字段更改时拆分文件,通过更改进行标识/命名文件(不需要引号),并剥离注释/特定行(此处由以“#”开头来表示)

修改后的方法:

public void Split(string inputfile, string outputfilesformat)
{

    System.IO.StreamWriter outfile = null;
    string line;
    string[] splitArray;
    string nameFromFile = "";
    try
    {
        using (var infile = new System.IO.StreamReader(inputfile))
        {
            while (!infile.EndOfStream)
            {
                line = infile.ReadLine();
                splitArray = line.Split(new char[] { ',' });
                if (!splitArray[0].StartsWith("\"#"))
                {
                    if (splitArray[4].Replace("\"", "") != nameFromFile.Replace("\"", ""))
                    {
                        if (outfile != null)
                        {
                            outfile.Dispose();
                            outfile = null;
                        }
                        nameFromFile = splitArray[4].Replace("\"", "");
                        continue;
                    }
                    if (outfile == null)
                    {
                        outfile = new System.IO.StreamWriter(
                            string.Format(outputfilesformat, nameFromFile),
                            false,
                            infile.CurrentEncoding);
                    }
                    outfile.WriteLine(line);
                }
            }
        }
    }
    finally
    {
        if (outfile != null)
            outfile.Dispose();
    }
}

本地路径调用:

    string strpath = Server.MapPath("~/Data/SPLIT/DATA.TXT");
    string newFile = Server.MapPath("~/Data/SPLIT");
    if (System.IO.File.Exists(@strpath))
    {
        Split(strpath, newFile+"\\{0}.CSV");
    }

0

如果有人需要使用字符串将文本文件拆分成多个文件:

public static void Main(string[] args)
    {
         void Split(string inputfile, string outputfilesformat)
        {
            int i = 0;
            System.IO.StreamWriter outfile = null;
            string line;

            try
            {
                using (var infile = new System.IO.StreamReader(inputfile))
                {

                    while (!infile.EndOfStream)
                    {
                        line = infile.ReadLine();
                        if (line.Trim().Contains("String You Want File To Split From"))
                        {
                            if (outfile != null)
                            {
                                outfile.Dispose();
                                outfile = null;
                            }
                            continue;
                        }
                        if (outfile == null)
                        {
                            outfile = new System.IO.StreamWriter(
                                string.Format(outputfilesformat, i++),
                                false,
                                infile.CurrentEncoding);
                        }
                        outfile.WriteLine(line);
                    }

                }
            }
            finally
            {
                if (outfile != null)
                    outfile.Dispose();
            }
        }
        Split("C:test.txt", "C:\\output-files-{0}.txt");

    }

这个答案只是重复了已被接受的答案 - Theodor Zoulias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接