首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C#中使用.csv文件以不同的名称逐个保存新文件

如何在C#中使用.csv文件以不同的名称逐个保存新文件
EN

Stack Overflow用户
提问于 2017-07-04 13:27:00
回答 3查看 48关注 0票数 0

我有一个.csv文件,文件示例如下所示,

代码语言:javascript
运行
复制
    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 ..this是我的.csv file.but的样本在原始file.In中有更多的原始文件在这里我想像下面这样分离这个原始.csv文件;

首先遇到False,因此所有的False详细信息都是假的,然后检查Marks1=TRUE,然后保存Discharge1_Mark1.csv,然后查看Marks2列,如果该列为真,则保存Discharge1_Mark2.csv

然后传递列符合True,然后检查Marks1=TRUE,然后保存Charge1_Mark1.csv,如果是Marks2=true,则保存Charge1_Mark2.csv

NOw再次传递列遇到False,然后要保存文件Discharge2_Marks1.csv。就像这样,我想保存我的文件。

我想在这里相应地说通过列TRUE,False你要保存文件就像我之前提到的那样,TRUE,FALSE满足。1,2,3,...you要用各自的Marks1,Marks2列检查各自的Pass列TRUE,false。在这里,我想将我生成的文件保存在各自的列中。

如果我保存Marks1,则列标题应为(Date,Pass,CutMarks1,Marks1 )如果我保存Marks2,则列标题应为(Date,Pass,CutMarks2,Marks2)

请给出我之前提到的如何生成文件,下面是我的code.my代码。

代码语言:javascript
运行
复制
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文件数据的类:

代码语言:javascript
运行
复制
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帮助解决我的问题。

EN

回答 3

Stack Overflow用户

发布于 2017-07-04 14:09:35

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

代码语言:javascript
运行
复制
- `List<DrawNew> dischargeMark1List` 
- `List<DrawNew> dischargeMark2List`
- `List<DrawNew> charge1Mark1List`
- `List<DrawNew>  charge1Mark2List`
代码语言:javascript
运行
复制
    1. You create a method `GenerateOutputCsv(List<DrawNew> selectedData)` to write the data to the correct file name. You just have to do the same checking as you did in `btnSeperateFile_Click(..)` method. 

票数 1
EN

Stack Overflow用户

发布于 2017-07-04 14:25:13

我把我的想法写在下面。我只关注4个案例:

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

<代码>F29

我想,也许还有另一个案例。

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

代码语言:javascript
运行
复制
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个案例的数据:

代码语言:javascript
运行
复制
var discharge1Mark1 = new List<Charge>();
var discharge1Mark2 = new List<Charge>();
var charge1Mark1 = new List<Charge>();
var charge1Mark2 = new List<Charge>();

在您的for循环中,我将进行如下处理:

代码语言:javascript
运行
复制
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创建headers,您可以简单地执行以下操作:

代码语言:javascript
运行
复制
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
}

希望你能理解,我的想法可能会有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2017-07-04 15:32:29

如果我正确理解您的问题,我想建议如下:

在您的DrawNew中,我将添加一个新字段来存储记录应导出到哪个csv文件的FileName。

代码语言:javascript
运行
复制
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循环中,我使用一些参数来确定每条记录的文件名。

代码语言:javascript
运行
复制
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);
        }

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

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44897593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档