如何一个个不同的名称,在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帮助解决我的问题,我如何生成这些文件。
-
对于每种类型的输出csv文件,您将需要4
lists
,如下所列。根据每个DrawNew
对象的条件,将其添加到其自己的列表中。List<DrawNew> dischargeMark1List
List<DrawNew> dischargeMark2List
List<DrawNew> charge1Mark1List
-
List<DrawNew> charge1Mark2List
- 创建一个方法
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
}
希望你明白,我的想法可以帮助。
,谢谢你的帮助。我编辑了我的内容。但是我的问题仍然没有解决。我想要生成文件名。一个一个。在这里'通过'列想要生成文件名,正如我提到的。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
你的意思是,你将通过整个数据集来确定它应该是的文件名?你能解释更多关于你的“第一”,“第二”吗?这是“第一排”,然后是“第二排”,那么等等? – zzT
在这里有一个'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列表进行排序。
希望这会有所帮助。
谢谢你的支持。我会尝试你的代码。 – user8235318
我试过这个代码,但数据重复该文件,并没有保存该文件,因为我wish.but谢谢你的帮助提前。 – user8235318
我添加了额外的文件名来存储应该将记录导出到哪个文件。如果你想立即导出它,你必须更新你的循环而不是foreach。我刚刚在这里更新:https://pastebin.com/U4v1rceD – zzT
你想在新生成的文件中放入什么内容? – grepLines
@ grepLines.oh抱歉,我现在编辑我的问题 – user8235318
@ grepLines.Thank您先生,我现在补充说我的问题。 – user8235318