使用C#如何将文本文件拆分为多个文件

使用C#如何将文本文件拆分为多个文件,c#,file-io,streamreader,C#,File Io,Streamreader,如何将包含ASCII码SOH和ETX的文本文件拆分为多个文件 对于exmaple,我命名为001234.txt的文本文件包含以下内容: SOH{ABCDXZY}ETX SOH{ABCDXZY}ETX SOH{ABCDXZY}ETX 我想将单个文本文件拆分为多个文本文件,每个ASCII代码以SOH开头,以ETX结尾 单个文本文件名应拆分为101234.txt、111234.txt..等,每个文件名都包含一个以SOH开头、以ETX结尾的内容 谢谢你的帮助。 使用System.IO; 使用System

如何将包含ASCII码SOH和ETX的文本文件拆分为多个文件

对于exmaple,我命名为001234.txt的文本文件包含以下内容:

SOH{ABCDXZY}ETX

SOH{ABCDXZY}ETX

SOH{ABCDXZY}ETX

我想将单个文本文件拆分为多个文本文件,每个ASCII代码以SOH开头,以ETX结尾

单个文本文件名应拆分为101234.txt、111234.txt..等,每个文件名都包含一个以SOH开头、以ETX结尾的内容

谢谢你的帮助。 使用System.IO; 使用System.Linq

namespace ASCII_Split
{
    class Program
    {
        static void Main(string[] args)
        {
            var txt = "";
            const char soh = (char)1;
            const char eox = (char)3;
            var count = 1;
            var pathToFile = @"‪‪C:\Temp\00599060.txt";

            using (var sr = new StreamReader(pathToFile))
                txt = sr.ReadToEnd();

            while (txt.Contains(soh))
            {
                var outfil = Path.Combine(Path.GetDirectoryName(pathToFile), count.ToString("000"), "_fix.txt");
                var eInd = txt.IndexOf(eox);
                using (var sw = new StreamWriter(outfil, false))
                {
                    sw.Write(txt.Substring(1, eInd - 1));
                }
                txt = txt.Substring(eInd + 1);
                count++;
            }

        }
    }
}

这或多或少会起到作用:


    //Read all text from file into a string
    var fileContent = File.ReadAllText("001234.txt");

    //split text into array according to a Regex pattern
    var pattern = @"SOH*ETX";
    var splitContent = Regex.Split(fileContent, pattern);

    //counter for file names
    var counter = 10;
    foreach(var content in splitContent)
    {
        //create file and use stream to write to it
        using (var stream = File.Create($"{counter++}1234.txt"))
        {
            var contentAsBytes = new UTF8Encoding(true).GetBytes(content);
            stream.Write(contentAsBytes, 0, contentAsBytes.Length);
        }
    }


由SOH和ETX提供,您指的是各自的控制字符,这应该可以帮助您实现:

var txt = "";
const char soh = (char) 1;
const char eox = (char) 3;
var count = 1;
var pathToFile = @"C:\00_Projects_temp\test.txt";

using (var sr = new StreamReader(pathToFile))
    txt = sr.ReadToEnd();

while (txt.Contains(soh))
{
    var outfil = Path.Combine(Path.GetDirectoryName(pathToFile), count.ToString("000"), "_test.txt");
    var eInd = txt.IndexOf(eox);
    using (var sw = new StreamWriter(outfil, false))
    {
        sw.Write(txt.Substring(1, eInd - 1));
    }
    txt = txt.Substring(eInd + 1);
    count++;
}

谢谢你,在程序运行时,我没有做什么改变,而是用“+”而不是“,”来表示文件名


我认为提问者指的是ASCII字符SOH(值01)和ETX(值03),而不是子字符串“SOH”和“ETX”My bad,但其中一些可能仍然有用。谢谢,但我已对问题进行了编辑以使其更清楚。请评论Stefan的答案,而不是编辑您的问题调试代码后,我得到以下使用错误(var sr=new StreamReader(pathToFile))说{“给定的路径的格式不受支持。”}什么错误?如果你说“下面的”,需要遵循…;-)当然可以。路径是指向我的测试文件夹。你需要改变这一点!请检查上面的代码,我正在使用的路径是否指向具有文件名的正确位置。未处理的异常:System.NotSupportedException:不支持给定路径的格式。位于System.Security.Permissions.FileIOPermission.EmulateFileOperationChecks(字符串完整路径)
using System.IO;
using System.Linq;


namespace ASCII_Split
{
    class Program
    {
        static void Main(string[] args)
        {
            var txt = "";
            const char soh = (char)1;
            const char eox = (char)3;
            var count = 1;
            var pathToFile = @"C:\Temp\00599060.txt";

            using (var sr = new StreamReader (pathToFile))
                txt = sr.ReadToEnd();

            if (txt.IndexOf(soh) != txt.LastIndexOf(soh))
            {


                while (txt.Contains(soh))
                {
                    var outfil = Path.Combine(Path.GetDirectoryName(pathToFile), count.ToString("00") + Path.GetFileName(pathToFile));
                    var eInd = txt.IndexOf(eox);
                    using (var sw = new StreamWriter(outfil, false))
                    {
                        sw.Write(txt.Substring(1, eInd - 1));
                    }
                    txt = txt.Substring(eInd + 1);
                    count++;
                }
                File.Move((pathToFile), (pathToFile) + ".org");
            }
        }
    }
}