如何一个个不同的名称,在C#中使用.csv文件保存另一个新文件

问题描述:

.csv文件文件的该样本是这样的,如何一个个不同的名称,在C#中使用.csv文件保存另一个新文件

Date,Pass,CutMark1,Marks1,CutMark2,Marks2 
22/06/2017 13:04:18,FALSE,TRUE,TRUE,FALSE,FALSE 
22/06/2017 13:04:20,FALSE,TRUE,TRUE,FALSE,FALSE 
22/06/2017 13:04:35,FALSE,TRUE,TRUE,FALSE,FALSE 
22/06/2017 13:04:37,FALSE,TRUE,TRUE,FALSE,FALSE 
22/06/2017 13:04:37,FALSE,TRUE,TRUE,FALSE,FALSE 
22/06/2017 13:04:38,FALSE,FALSE,TRUE,FALSE,FALSE 
22/06/2017 13:04:39,FALSE,FALSE,TRUE,FALSE,FALSE 
22/06/2017 13:04:40,FALSE,FALSE,TRUE,TRUE,FALSE 
22/06/2017 13:04:41,FALSE,FALSE,TRUE,TRUE,TRUE 
22/06/2017 13:04:42,FALSE,FALSE,FALSE,TRUE,TRUE 
22/06/2017 13:04:44,FALSE,FALSE,FALSE,TRUE,TRUE 
22/06/2017 13:04:45,TRUE,FALSE,FALSE,TRUE,TRUE 
22/06/2017 13:04:46,TRUE,FALSE,FALSE,TRUE,TRUE 
22/06/2017 13:04:48,TRUE,FALSE,FALSE,FALSE,TRUE 
22/06/2017 13:04:49,TRUE,FALSE,FALSE,FALSE,TRUE 
22/06/2017 13:04:50,TRUE,FALSE,FALSE,FALSE,TRUE 
22/06/2017 13:04:52,FALSE,TRUE,TRUE,FALSE,TRUE 
22/06/2017 13:04:53,FALSE,TRUE,TRUE,FALSE,TRUE 
22/06/2017 13:04:54,FALSE,TRUE,TRUE,FALSE,TRUE 
22/06/2017 13:04:56,FALSE,TRUE,TRUE,FALSE,TRUE 
22/06/2017 13:04:57,FALSE,TRUE,TRUE,FALSE,TRUE 
22/06/2017 13:04:58,FALSE,TRUE,TRUE,FALSE,TRUE 
22/06/2017 13:05:00,TRUE,TRUE,TRUE,TRUE,FALSE 
22/06/2017 13:05:01,TRUE,TRUE,TRUE,TRUE,FALSE 
22/06/2017 13:05:02,TRUE,TRUE,TRUE,TRUE,FALSE 
22/06/2017 13:05:04,TRUE,TRUE,TRUE,TRUE,FALSE 
22/06/2017 13:05:05,TRUE,TRUE,TRUE,TRUE,FALSE 
22/06/2017 13:05:06,TRUE,TRUE,TRUE,TRUE,FALSE 
22/06/2017 13:05:08,TRUE,TRUE,TRUE,TRUE,FALSE 

所以现在我要将此文件保存为在这里Pass column数据流是这样的,FALSE> TRUE> FALSE> TRUE ..这是我的.csv文件的样本,但原始文件中有更多的原始文件。在这里我想分离这个原始的.csv文件,就像以下;

第一次遇到False所以全部是False细节然后检查Marks1 = TRUE,然后保存Discharge1_Mark1.csv,然后看Marks2列,如果那个列是true,那么保存Discharge1_Mark2.csv

其次通过列满足True然后检查Marks1 = TRUE,然后保存Charge1_Mark1.csv,然后如果Marks2 = true,则保存Charge1_Mark2.csv

NOw再通栏符False然后要保存文件Discharge2_Marks1.csv。 就像我想保存我的文件。

我想在这里说相应的通过列TRUE,假想你想保存文件,就像我之前提到的那样,TRUE,FALSE会遇到什么时候.1,2,3,...你想检查各自的通过列TRUE false与相应的Marks1,Marks2列。 在这里我想保存我生成的文件各自therir列。

如果我救标志1则列标题应该(日期,通行证,CutMarks1,标志1) 如果我救Marks2然后列标题应该(日期,通行证,CutMarks2,Marks2)

请给我如何生成文件,我之前在我的代码中提到过,我的代码如下。

using System.Globalization; 

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


    private void btnSeperateFile_Click(object sender, EventArgs e) 
     { 
      int discharge_counter = 0; 
      int charge_counter = 0; 

      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 = (valuesCsvLine[3] == "TRUE" ?true: false);     
        mngInstance.CutMark2 = (valuesCsvLine[4] == "TRUE" ? true : false); 
        mngInstance.Marks2 = (valuesCsvLine[5] == "TRUE" ?true: false); 

        ObserveData.Add(mngInstance); 

        if (mngInstance.Pass==true && mngInstance.Marks1==true) 
        { 


        } 
        if (mngInstance.Pass == false && mngInstance.Marks1 == true) 
        { 

        } 
        if (mngInstance.Pass == true && mngInstance.Marks2 == true) 
        { 

        } 
        if (mngInstance.Pass == false && mngInstance.Marks2 == true) 
        { 

        }    
       } 
      } 

这是用于存储.csv文件的数据的类:

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

我的问题是,我提到before.please帮助解决我的问题,我如何生成这些文件。

+0

你想在新生成的文件中放入什么内容? – grepLines

+0

@ grepLines.oh抱歉,我现在编辑我的问题 – user8235318

+0

@ grepLines.Thank您先生,我现在补充说我的问题。 – user8235318

  1. 对于每种类型的输出csv文件,您将需要4 lists,如下所列。根据每个DrawNew对象的条件,将其添加到其自己的列表中。

    • List<DrawNew> dischargeMark1List
    • List<DrawNew> dischargeMark2List
    • List<DrawNew> charge1Mark1List
    • List<DrawNew> charge1Mark2List

        开始=>
      1. 创建一个方法GenerateOutputCsv(List<DrawNew> selectedData)以将数据写入到正确的文件名。您只需要执行与btnSeperateFile_Click(..)方法中所做的相同的检查。

    我下面写了我的想法草案。我只关注4种情况:

    • Pass = True,CutMark1 = True。
    • Pass = True,CutMark2 = True。
    • Pass = False,CutMark1 = True。
    • Pass = False,CutMark2 = True。

    还有另外一种情况,我想。

    因此,首先,我创建了一个新模型来存储数据。

    public class Charge 
    { 
        public DateTime Date { get; set; } 
        public bool Pass { get; set; } 
        public bool CutMark { get; set; } 
        public int Marks { get; set; } 
    } 
    

    然后,我创建了4分列出来存储数据4例:

    var discharge1Mark1 = new List<Charge>(); 
    var discharge1Mark2 = new List<Charge>(); 
    var charge1Mark1 = new List<Charge>(); 
    var charge1Mark2 = new List<Charge>(); 
    

    在你的for循环中,我将处理象下面这样:

    var date = DateTime.ParseExact(valuesCsvLine[0], dateFormatString, CultureInfo.InvariantCulture); 
          var pass = (valuesCsvLine[1] == "TRUE" ? true : false); 
          var cutMark1 = (valuesCsvLine[2] == "TRUE" ? true : false); 
          var marks1 = int.Parse(valuesCsvLine[3]); 
          var cutMark2 = (valuesCsvLine[4] == "TRUE" ? true : false); 
          var marks2 = int.Parse(valuesCsvLine[5]); 
          if (pass) 
          { 
           if (cutMark1) 
            discharge1Mark1.Add(new Charge 
            { 
             Date = date, 
             Pass = pass, 
             Marks = marks1, 
             CutMark = cutMark1 
            }); 
           else 
            discharge1Mark2.Add(new Charge 
            { 
             Date = date, 
             Pass = pass, 
             Marks = marks2, 
             CutMark = cutMark2 
            }); 
          }else 
          { 
           if (cutMark1) 
            charge1Mark1.Add(new Charge 
            { 
             Date = date, 
             Pass = pass, 
             Marks = marks1, 
             CutMark = cutMark1 
            }); 
           else 
            charge1Mark2.Add(new Charge 
            { 
             Date = date, 
             Pass = pass, 
             Marks = marks2, 
             CutMark = cutMark2 
            }); 
          } 
    

    于程式创建头CSV,你可以简单地做如下:

    private void ExportToCSV(List<Charge> data, bool discharge, int num) 
    { 
        var filename = discharge ? "Discharge1" : "Charge1"; 
        filename += (num == 1) ? "_Mark1.csv" : "_Mark2.csv"; 
        var headerCol1 = "Date"; 
        var headerCol2 = "Pass"; 
        var headerCol3 = (num == 1) ? "CutMark1" : "CutMark2"; 
        var headerCol4 = (num == 1) ? "Mark1" : "Mark2"; 
        //your exporting function below 
    } 
    

    希望你明白,我的想法可以帮助。

    +0

    ,谢谢你的帮助。我编辑了我的内容。但是我的问题仍然没有解决。我想要生成文件名。一个一个。在这里'通过'列想要生成文件名,正如我提到的。first first False然后文件名保存为Discharge1,第二次遇到True然后Charge1,然后再遇到Flse然后Discharge2,然后Charge2,就像我想保存file.save数据onlt Marks1或Marks2是真的only.getting name我们想看到Paas列模式有,TURE或False和marks1或marks2只是TRUE.I搞砸了我的code.please给我一个解决方案。如果你可以。谢谢。 – user8235318

    +0

    你的意思是,你将通过整个数据集来确定它应该是的文件名?你能解释更多关于你的“第一”,“第二”吗?这是“第一排”,然后是“第二排”,那么等等? – zzT

    +0

    在这里有一个'Pass'cplumn,pass列有TURE或FAlSE values.ok?所以认为pass就像是给battery.ok充电一样,现在首先我们看到了这个列的False数据,之后再次是false和after那真的好吗?那么我说好像电池那么如果有真的那就充电电池,然后假电池放电。如明智先遇到放电1然后充电1然后再放电遇到然后文件名要纠正放电2然后充电2明智的检查并保存文件。在这里Marks1认为像电池1 Marks2认为像电池2那么,Marks1或Marks2只想要True。 – user8235318

    如果我正确地理解你的问题,我想建议象下面这样:

    在你DrawNew,我将添加一个新字段来存储该记录应导出到CSV文件的文件名。

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

    然后,在您的for循环中,我使用一些参数来确定每个记录的文件名。

    List<DrawNew> ObservingData = new List<DrawNew>(); // List to store all available DrawNew objects from the CSV 
    
         // Loops through each lines in the CSV 
         var fileName = ""; 
         var previousPassValue = true; 
         var count = 0; 
         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 = (valuesCsvLine[3] == "TRUE" ? true : false); 
          mngInstance.CutMark2 = (valuesCsvLine[4] == "TRUE" ? true : false); 
          mngInstance.Marks2 = (valuesCsvLine[5] == "TRUE" ? true : false); 
          if (count == 0) 
          { 
           previousPassValue = mngInstance.Pass; 
           count++; 
          } 
    
          if (previousPassValue != mngInstance.Pass) 
          { 
           previousPassValue = mngInstance.Pass; 
           count++; 
          } 
    
          if (mngInstance.Pass == true && mngInstance.Marks1 == true) 
          { 
           fileName = "Charge" + count + "_Mark1.csv"; 
    
          } 
          if (mngInstance.Pass == false && mngInstance.Marks1 == true) 
          { 
           fileName = "DisCharge" + count + "_Mark1.csv"; 
          } 
          if (mngInstance.Pass == true && mngInstance.Marks2 == true) 
          { 
           fileName = "Charge" + count + "_Mark2.csv"; 
          } 
          if (mngInstance.Pass == false && mngInstance.Marks2 == true) 
          { 
           fileName = "DisCharge" + count + "_Mark2.csv"; 
          } 
    
          mngInstance.FileName = fileName; 
    
          ObservingData.Add(mngInstance); 
         } 
    

    我假定你的数据文件是正确的。在将它导出到excel之前,您将按FileName对ObservingData列表进行排序。

    希望这会有所帮助。

    +0

    谢谢你的支持。我会尝试你的代码。 – user8235318

    +0

    我试过这个代码,但数据重复该文件,并没有保存该文件,因为我wish.but谢谢你的帮助提前。 – user8235318

    +0

    我添加了额外的文件名来存储应该将记录导出到哪个文件。如果你想立即导出它,你必须更新你的循环而不是foreach。我刚刚在这里更新:https://pastebin.com/U4v1rceD – zzT