2017-07-06 14 views
0

私は.csvファイルを持っています。このファイルを使用してファイルを作成したいと思います。これは.csvファイルの形式です。これは私の.csvファイルの小さな部分です。元のファイルには60000行以上の行があります。C#で1つの.csvファイルを使用して条件を確認してファイルを保存する方法

Date,Pass,CutMark1,Marks1,CutMark2,Marks2, 
22/06/2017 13:04:18,FALSE,TRUE,40,FALSE,35, 
22/06/2017 13:04:20,FALSE,TRUE,35,FALSE,35, 
22/06/2017 13:04:35,FALSE,TRUE,55,FALSE,55, 
22/06/2017 13:04:37,FALSE,TRUE,100,FALSE,55, 
22/06/2017 13:04:37,FALSE,TRUE,38,FALSE,55, 
22/06/2017 13:04:38,FALSE,FALSE,35,FALSE,55, 
22/06/2017 13:04:39,FALSE,FALSE,35,FALSE,38, 
22/06/2017 13:04:40,FALSE,FALSE,35,TRUE,38, 
22/06/2017 13:04:41,FALSE,FALSE,55,TRUE,38, 
22/06/2017 13:04:42,FALSE,FALSE,55,TRUE,55, 
22/06/2017 13:04:44,FALSE,FALSE,38,TRUE,55, 
22/06/2017 13:04:45,TRUE,FALSE,38,TRUE,40, 
22/06/2017 13:04:46,TRUE,FALSE,38,TRUE,40, 
22/06/2017 13:04:48,TRUE,FALSE,55,FALSE,40, 
22/06/2017 13:04:49,TRUE,FALSE,55,FALSE,25, 
22/06/2017 13:04:50,TRUE,FALSE,55,FALSE,45, 
22/06/2017 13:04:52,FALSE,TRUE,55,FALSE,60, 
22/06/2017 13:04:53,FALSE,TRUE,40,FALSE,80, 
22/06/2017 13:04:54,FALSE,TRUE,40,FALSE,80, 
22/06/2017 13:04:56,FALSE,TRUE,40,FALSE,75, 
22/06/2017 13:04:57,FALSE,TRUE,40,FALSE,90, 
22/06/2017 13:04:58,FALSE,TRUE,55,FALSE,88, 
22/06/2017 13:05:00,TRUE,TRUE,55,TRUE,23, 
22/06/2017 13:05:01,TRUE,TRUE,55,TRUE,45, 
22/06/2017 13:05:02,TRUE,TRUE,20,TRUE,78, 
22/06/2017 13:05:04,TRUE,TRUE,45,TRUE,45, 
22/06/2017 13:05:05,TRUE,TRUE,85,TRUE,69, 
22/06/2017 13:05:06,TRUE,TRUE,62,TRUE,45, 
22/06/2017 13:05:08,TRUE,TRUE,100,TRUE,35, 

このファイルを次のように保存します。ここでは、 "パス"列がチェックしたい。 False、True、False、True、等がありますので、これを使ってファイルを保存します。一例として、このファイルを最初にFalseの値をFalse1.csvとして保存してから、次にTrue1.csvをもう一度False2.csvに再度遭遇させて、TrueまたはFalseが何回会うかのファイル名に数値を追加したい。この.csvファイルには、他のすべての列を保存する必要があります。

私は説明のために私のためにこの例を使用します、私は最初に偽の値と真の値を別のファイルに保存したいと思います。私はこの事例を得ています。ここでは、Pass列の最初の11行は「False」です。だから私はFalse1.csvとして保存する必要があるそれらの(1-11)行を保存したい場合は、True1.csvとして保存する必要があります行(12-16)がパス "真"を満たし、その後、パス値は再び "偽"を満たして保存これらの行(17-22)はFalse2.csvが再びパス列を満たしているので「True」となり、その行(23-29)はTrue2.csvとして保存されます。同様に保存したい場合は、.csvファイルに60000個のrawsがあります。

これは.csvファイルを読むためのコードです。

using System.Globalization; 

public static string dateFormatString = "dd/MM/yyyy HH:mm:ss"; 

private void btnSeperateFile_Click(object sender, EventArgs e) 
{ 
    if (tbOutputFilePath2 != null) 
    { 
     List<DrawNew> ObservingData = new List<DrawNew>(); // List to store all available DrawNew objects from the CSV 

     // Loops through each lines in the CSV 
     foreach (string line in System.IO.File.ReadAllLines(outputFilePath.Text).Skip(1)) // .Skip(1) is for skipping header 
     { 
      string[] valuesCsvLine = line.Split(','); 
      DrawNew mngInstance = new DrawNew(); 

      mngInstance.Date = DateTime.ParseExact(valuesCsvLine[0], dateFormatString, CultureInfo.InvariantCulture); 
      mngInstance.Pass = (valuesCsvLine[1] == "TRUE" ? true : false); 
      mngInstance.CutMark1 = (valuesCsvLine[2] == "TRUE" ?true: false); 
      mngInstance.Marks1 = int.Parse(valuesCsvLine[3]);     
      mngInstance.CutMark2 = (valuesCsvLine[4] == "TRUE" ? true : false); 
      mngInstance.Marks2 = int.Parse(valuesCsvLine[5]); 

      ObserveData.Add(mngInstance); 
     }    
    } 
} 

これは.csvファイルのデータを格納するためのクラスです:

class DrawNew 
{ 
    public DateTime Date { get; set; } // property to store Date 
    public bool Pass { get; set; } // property to store Pass 
    public bool CutMark1 { get; set; } // property to store CutMark1 
    public int Marks1 { get; set; } // property to store Marks1 
    public bool CutMark2 { get; set; } // property to store CutMark2 
    public int Marks2 { get; set; } // property to store Marks2 
} 

答えて

0

おそらくない最高または最もパフォーマンスまたはそれを行うにしても素敵な方法、それはあなたが始めるかもしれません:

using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.Linq; 

[...] 

public void StoreSeparatedByPass(IEnumerable<DrawNew> observingData) 
{ 
    // keep the file numbers easily accessible 
    var fileCounts 
    = new Dictionary<bool, int> 
     { 
     { false, 0 }, 
     { true, 0 } 
     }; 

    bool? pass = null; 
    var lines = new List<DrawNew>(); 

    foreach (var drawNew in observingData) 
    { 
    // to differentiate between "starting with false" 
    // and "starting with true". 
    // (only interesting on first item) 
    if (pass.HasValue == false) 
    { 
     pass = drawNew.Pass; 
    } 

    if (pass.Value != drawNew.Pass) 
    { 
     // the value of drawNew.Pass changed, the previous "part" has ended. 
     // now we need to do store the collected lines (if there are any)... 
     if (lines.Any()) 
     { 
     fileCounts[pass.Value]++; 
     StoreLines(lines, pass.Value.ToString() + fileCounts[pass.Value] + ".csv"); 

     // then clear the stored list for the next part... 
     lines.Clear(); 
     } 

     // and change the part indicator. 
     pass = drawNew.Pass; 
    } 

    lines.Add(drawNew); 
    } 

    // don't forget to store the last part... 
    if (pass.HasValue && lines.Any()) 
    { 
    fileCounts[pass.Value]++; 
    StoreLines(lines, pass.Value.ToString() + fileCounts[pass.Value] + ".csv"); 
    } 
} 
public void StoreLines(IEnumerable<DrawNew> lines, string fileName) 
{ 
    // TODO: actually write the DrawNew items to the given filename 
} 
+0

ありがとう、あなたの助けをありがとう。そのファイルを保存するために列見出しを転送する方法を言うことができます。 – user8235318

+0

最も簡単な方法は、元のファイル(スキップしたもの)の最初の行を取得して覚えておき、最初の行をすべての新しいファイル( 'StoreLines'内)に書き込むことです。 – Corak

関連する問題