2010-11-30 26 views
5

C# 'da, karakter kodlamasını korurken bir metin dosyasını birden fazla metin dosyasına (bölme sınırlayıcısı boş satır) ayırmanın en etkili yöntemi nedir?Metin dosyası birden çok dosyaya nasıl bölünür?

ise: düşünme kaçınmak isteyenler için Tamamen

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

Unvanınız ve gerçek soru farklıdır. Bir metin dosyasının (başlık) nasıl bölüneceğini veya daha verimli bir şekilde nasıl yapılacağını (soru) öğrenmek ister misiniz? –

+0

İkisini de arıyorum. Metin dosyasını en verimli şekilde bölme! – GPX

cevap

7

ben StreamReader ve StreamWriter sınıflarını kullanmak istiyorsunuz Bir CSV (virgülle ayrılmış değerler) dosyanız var ve bir alan değiştiğinde dosyayı ayırmak, dosyayı değiştirerek/değiştirerek (gereksiz alıntı işaretleri olmadan) ve yorum/c (Burada #" ile başlayan tarafından tanımlanan) ertain hatları

Modifiye yöntemi:

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

Yerel yolu çağrı:

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

+1, ancak boş bir satırın boş veya boş bir dize yerine "System.Environment.NewLine" değerine sahip olup olmadığını merak ediyorum. –

+0

@adrift: System.Environment.NewLine' her satırın sonuna (veya başına) eklenemez mi? – GPX

+0

Metin dosyalarındaki "boş satır" her zaman yalnızca \ r \ n (veya işletim sistemine dayalı türevler), başka nasıl algılarsınız? Metin dosyası sadece chars akışıdır. –

0

: Bu durumda, böyle bu yöntem çağırır

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

:

İlgili konular