2017-01-03 45 views
0

我正在編寫一個程序,它將一個CSV文件分成四個幾乎相等的部分。文件拆分中缺少的行

我使用的是2000行的CSV輸入文件作爲示例,並且在查看輸出文件時,第一個文件中缺少行,並且還有不完整的行,這是沒有意義的,因爲我正在寫逐行。這裏代碼:

using System.IO; 
using System; 
class MainClass { 
    public static void Main(string[] args){ 

    string line; 
    int linesNumber = 0, linesEach = 0, cont = 0; 

    StreamReader r = new StreamReader("in.csv"); 
    StreamWriter w1 = new StreamWriter("out-1.csv"); 
    StreamWriter w2 = new StreamWriter("out-2.csv"); 
    StreamWriter w3 = new StreamWriter("out-3.csv"); 
    StreamWriter w4 = new StreamWriter("out-4.csv"); 

    while((line = r.ReadLine()) != null) 
     ++linesNumber; 

    linesEach = linesNumber/4; 

    r.DiscardBufferedData(); 
    r.BaseStream.Seek(0, SeekOrigin.Begin); 
    r.BaseStream.Position = 0; 

    while((line = r.ReadLine()) != null){ 
     ++cont; 
     if(cont == 1){ 
     //fisrt line must be skipped 
     continue; 
     } 
     if(cont < linesEach){ 
     Console.WriteLine(line); 
     w1.WriteLine(line); 
     } 
     else if(cont < (linesEach*2)){ 
     w2.WriteLine(line); 
     } 
     else if(cont < (linesEach*3)){ 
     w3.WriteLine(line); 
     } 
     else{ 
     w4.WriteLine(line); 
     } 
    } 
    } 
} 

爲什麼寫作部分做錯了?我該如何解決它?

謝謝大家的幫助。

+0

那麼,你有沒有在調試器中的每一行代碼? – OldProgrammer

+2

我們使用的示例數據? – BenVlodgi

+0

第一個文件中缺少的是什麼意思?這是最後一行,因爲你正在計數'<'而不是'<=',你的意思是不完整的行嗎?我建議你在'使用'語句中包裝這個,並使用正確的編碼作爲這個原因問題。 – Jegan

回答

1

這不是直接回答你的問題,只是一個選擇。

的LINQ可以用來創建短代碼

int inx = 0; 
var fInfo = new FileInfo(filename); 

var lines = File.ReadAllLines(fInfo.FullName); 
foreach (var groups in lines.GroupBy(x => inx++/(lines.Length/4))) 
{ 
    var newFileName = $"{fInfo.DirectoryName}\\{fInfo.Name}_{groups.Key}{fInfo.Extension}"; 
    File.WriteAllLines(newFileName, groups); 
} 
+0

之前從未聽說過linq,感謝您向我展示它! – sant016

1

您可以通過使用Partitioner和一些LINQ簡化你的方法。它還具有隻能同時打開兩個文件句柄的好處,而不是每個輸出文件加上原始輸入文件1個。

using System.Collections.Concurrent; 
using System.IO; 
using System.Linq; 

namespace FileSplitter 
{ 
    internal static class Program 
    { 
     internal static void Main(string[] args) 
     { 
      var input = File.ReadLines("in.csv").Skip(1); 

      var partitioner = Partitioner.Create(input); 
      var partitions = partitioner.GetPartitions(4); 

      for (int i = 0; i < partitions.Count; i++) 
      { 
       var enumerator = partitions[i]; 

       using (var stream = File.OpenWrite($"out-{i + 1}.csv")) 
       { 
        using (var writer = new StreamWriter(stream)) 
        { 
         while (enumerator.MoveNext()) 
         { 
          writer.WriteLine(enumerator.Current); 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

謝謝你,好像你需要知道的很好,我把它看成是複雜的。我會學習它! – sant016

0

謝謝大家的回答。

問題是,正如Jegan和spender建議的那樣,StreamWriter需要包含在using子句中。這就是說,問題解決了。