0
votes

Utilisation de C # comment puis-je diviser un fichier texte en plusieurs fichiers

Comment puis-je diviser un fichier texte contenant du code ASCII SOH et ETX en plusieurs fichiers?

Par exemple, le fichier texte que j'ai nommé 001234.txt contient le contenu suivant:

SOH {ABCDXZY } ETX

SOH {ABCDXZY} ETX

SOH{ABCDXZY}ETX

Je voudrais diviser le fichier texte unique en plusieurs fichiers texte pour chaque code ASCII qui commence par SOH et se termine par ETX.

Le nom de fichier texte unique doit être divisé en 101234.txt, 111234.txt..etc et chacun contient un seul contenu qui commence par SOH et se termine par ETX.

J'apprécie toute aide.

using System.IO; en utilisant 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++;
            }

        }
    }
}


1 commentaires

Veuillez commenter la réponse de Stefan au lieu de modifier votre question


3 Réponses :


1
votes

Cela devrait plus ou moins faire l'affaire:

    //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);
        }
    }


3 commentaires

Je pense que le demandeur fait référence aux> caractères ASCII SOH (valeur 01) et ETX (valeur 03), pas aux sous-chaînes "SOH" et "ETX"


Mon mal, mais peut-être qu'une partie est encore utile.


Merci, mais j'ai édité la question pour être plus claire.



0
votes

Fourni par SOH et ETX, vous voulez dire les caractères de contrôle respectifs, ceci devrait vous mettre sur votre chemin:

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++;
}


13 commentaires

Après avoir débogué le code, j'obtiens l'erreur suivante pour l'utilisation (var sr = new StreamReader (chemin d'accès au fichier)) en disant {"Le format du chemin donné n'est pas pris en charge."}


Quelle erreur? Si vous dites "ce qui suit", quelque chose doit suivre ... ;-)


Bien sûr, vous le faites. Le chemin est vers mon dossier de test. Vous devez changer cela!


S'il vous plaît vérifier le code ci-dessus que j'utilise le chemin est pointé vers l'emplacement correct avec le nom du fichier.


Exception non gérée: System.NotSupportedException: le format du chemin donné n'est pas pris en charge. à System.Security.Permissions.FileIOPermission.EmulateFileIOPe‌ rmissionChecks (Strin‌ g fullPath)


Avez-vous utilisé le bon chemin d'accès complet au fichier? Remarque: votre utilisation de Path.GetFileName avec un caractère générique ne fonctionnera pas. Utiliser un chemin complet comme je l'ai fait dans cet exemple le fera.


J'ai utilisé le chemin complet du fichier.


L'erreur est-elle toujours avec using (var sr = new StreamReader ... ? Mélangez-vous ce code avec votre code d'origine de quelque manière que ce soit? Je ne comprends pas comment l'erreur pourrait survenir si vous utilisez le chemin correct.


oui l'erreur pointe toujours avec l'utilisation de (var sr = new StreamReader


Veuillez ne pas modifier MA réponse. Telle est ta question. Veuillez modifier votre question si vous souhaitez fournir plus d'informations. Assurez-vous que le chemin est correct et que le fichier existe vous avez l'autorisation de lecture / écriture sur cet emplacement.


Copiez votre fichier dans un autre emplacement. Il est préférable de créer un dossier séparé pour cela. Il y a un problème d'autorisation en cours.


Merci, cela a fonctionné. Comment puis-je faire en sorte qu'il divise le SOH et l'ETX supplémentaires et non le premier? Par exemple, si SOH AND ETX est supérieur à 1, divisez le reste et non le premier.


Cela les divise TOUS. Veuillez être plus précis. Modifiez votre question avec un exemple et également ce que vous avez essayé. Veuillez montrer quelques efforts.



0
votes

Merci ingénieur LOC Le programme fonctionne, j'ai peu changé pour concaténer le nom de fichier avec le compteur à l'aide de "+" au lieu de "", ". xxx


0 commentaires