2017-01-03 2 views
0

私はCSVファイルを4つのほぼ同等の部分に分割するプログラムを作成しています。ファイル分割に行がありません

例として、2000行のCSV入力ファイルを使用していますが、出力ファイルを確認すると、最初のファイルに行がありません。また、私が書いているので意味のない未完成の行もあります1行ずつ。ここにコード:

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

最初のファイルに行がないことはどういう意味ですか?これは最後の行ですか?<= 'ではなく、<='ではありません。不完全な行はどういう意味ですか?私はこれを 'using'ステートメントの中にラップして、正しいエンコーディングを使用することをお勧めします。 – Jegan

答えて

1

これは、あなたの質問に直接的な答えではなく、単なる選択肢です。

LINQのは、あなたがPartitionerといくつかの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

を作成するために使用することができます。また、各出力ファイルと元の入力ファイルに1つずつではなく、2つのファイルハンドルを一度に開くだけの利点があります。

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

ありがとうございました。

ジェーンと投機官が示唆したように、StreamWriterusing句にラップする必要があるという問題があります。それは問題が解決したと言いました。

関連する問題