2010-11-30 26 views
5

En C#, quelle est la méthode la plus efficace pour diviser un fichier texte en plusieurs fichiers texte (le séparateur de séparation étant une ligne vide), tout en préservant le codage des caractères?Comment diviser un fichier texte en plusieurs fichiers?

+1

Votre titre et votre question réelle sont différentes. Voulez-vous savoir comment diviser un fichier texte (titre), ou comment le faire plus efficacement (question)? –

+0

Je suis à la recherche des deux. Diviser le fichier texte de la manière la plus efficace! – GPX

Répondre

7

J'utiliser les classes StreamReader et 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(); 
    } 
} 

Vous pouvez ensuite appeler cette méthode comme ceci:

Split("C:\\somefile.txt", "C:\\output-files-{0}.txt"); 
+0

+1, mais je me demande si une ligne vide peut avoir la valeur 'System.Environment.NewLine' plutôt qu'une chaîne vide ou vide. –

+0

@adrift: "System.Environment.NewLine" ne serait-il pas ajouté à la fin (ou au début) de chaque ligne? – GPX

+0

La "ligne vide" dans les fichiers texte est toujours juste \ r \ n (ou variantes basées sur OS), sinon comment le détecter? Le fichier texte est juste un flux de caractères. –

0

Purement pour ceux qui veulent éviter de penser:

Si vous avez un fichier CSV (valeurs séparées par des virgules) et que vous voulez diviser le fichier quand un champ change, identifiez/nommez le fichier par le changement (sans les guillemets inutiles), et supprimez les commentaires/c lignes ertains (ici identifiés en commençant par « #)

méthode de modification:

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

appel Chemin local:

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