C# 删除csv文件中的多行
我有一个csv文件的大日志,我想删除这些文件,直到更接近当前日期,这取决于我提供的输入。C# 删除csv文件中的多行,c#,csv,C#,Csv,我有一个csv文件的大日志,我想删除这些文件,直到更接近当前日期,这取决于我提供的输入。 目标: *最小化我的csv日志文件的内容。 *如果未找到所选日期,请通过再次写入文件来保留整个日志(因为据我所知,如果我们正在做某件事,我们会反复阅读该文件)。 表单:我有一个表单包含浏览按钮和一个名为“txtfilename”(在这里显示目录)的文本框。查看我的csv文件中的Datagridview。Datetimepicker是我可以选择的日期。一个按钮可删除多行,直到选择日期。 代码任务:使用stre
目标:
*最小化我的csv日志文件的内容。
*如果未找到所选日期,请通过再次写入文件来保留整个日志(因为据我所知,如果我们正在做某件事,我们会反复阅读该文件)。
表单:
我有一个表单包含浏览按钮和一个名为“txtfilename”(在这里显示目录)的文本框。查看我的csv文件中的Datagridview。Datetimepicker是我可以选择的日期。一个按钮可删除多行,直到选择日期。
代码任务:
使用streamreader读取整行代码。“如果”条件,用于评估所选日期是否已找到并断开该行。Streamwriter编写其余的行。注意!在阅读时包含要删除的标题,因此我再次使用writer和一个tempfile来保存其余的行,并在行的开头插入一个标题。
代码错误:
*如果我再次选择过滤文件。错误说明:进程无法访问该文件,因为另一进程正在使用该文件。
缺少代码:
*如何关闭streamreader。
*如果读者无法遇到datetimepicker给出的日期,如何重新写入整行内容。
示例csv文件:
“员工代码”、“日期”、“时间”、“类型”
“3434”、“01/22/2013”、“07:54”、“0”
“3023”、“01/23/2013”、“07:54”、“0”
...... ..... .... .....
...... ..... .... .....
...... ..... .... .....
“4863”、“01/26/2017”、“07:55”、“0”
“2513”、“01/28/2017”、“07:55”、“0”
“2582”、“2017年1月29日”、“07:55”、“0”
上面的代码正在运行,但需要改进以上语句的基础。
注意!一个文件名处理-使用TempFile。我建议去掉
读卡器
,写卡器
,流
,但使用文件
类;诸如此类:
private static void ProcessLog(string sourceFileName,
string targetFileName,
string textToFind) {
// Do nothing if "file contains the date given by DateTimePicker"
if (File
.ReadLines(fileName)
.Any(line => line.Contains(textToFind)))
return;
// "Write again the whole file" ( == copy it ?)
File.Copy(sourceFileName, targetFileName, true);
}
private void button11_Click(object sender, EventArgs e) {
ProcessLog(txtFileName.Text, Path.GetTempFileName(), dateTimePicker1.Text);
...
}
编辑:如果我误解了你,你真的想跳过第一个DateTimePicker日期出现之前的所有行,然后写下其余行(见Chris的评论):
您不需要关闭
StreamReader
,因为using
正在调用Dispose()
,这将关闭StreamReader
。我只是键入@janesabouchleich所说的内容,但对于其余内容,您需要提供更多详细信息。我不确定第一个问题是关于什么的。或者确切的问题是什么//在代码中写一些注释来解释该行是否包含datetimepicker值,使用以下代码:如果(line.Contains(dateTimePicker1.Text))它将中断该行。然后,如果该行不包含datetimepicker值,那么我需要再次写入整行。这是我的第一个问题哦,不!将例程放入任务中
并等待它”//如果“文件包含DateTimePicker给定的日期,则不执行任何操作”-这不是原始例程所做的操作。直到找到日期时间,原始文件才从原始文件中写入任何行,然后再写入所有行。它删除了文件的开头。@Chris:我明白了,谢谢!我已经编辑了答案(在找到DateTimePicker的日期之前跳过顶部文件的行),我认为这是两者的结合(试图保持评论简短的风险意味着我不认为我解释了我对OP的解释),但在这一点上,我想我们需要OP对确切要求进行澄清。因此,虽然我不确定你的答案是否完整,但它应该给OP提供整理自己所需的部分。@Chris:我完全同意你的观点,这个问题应该以更好的方式解释(当给出日志文件时,期望的结果是什么)。然而,我认为使用File
类和Linq可以显著简化例程(无论实际需要什么结果),这就是我将其作为答案的原因。同意。我的观点是,您的代码可能无法作为解决方案进行复制和复制,但它具有所有正确的想法,因此,如果OP了解您正在做什么,他们应该能够根据自己的需求对其进行修改。这就是为什么你得到了我的+1.:)
private static void ProcessLog(string sourceFileName,
string targetFileName,
string textToFind) {
// Do nothing if "file contains the date given by DateTimePicker"
if (File
.ReadLines(fileName)
.Any(line => line.Contains(textToFind)))
return;
// "Write again the whole file" ( == copy it ?)
File.Copy(sourceFileName, targetFileName, true);
}
private void button11_Click(object sender, EventArgs e) {
ProcessLog(txtFileName.Text, Path.GetTempFileName(), dateTimePicker1.Text);
...
}
private static void ProcessLog(string sourceFileName,
string targetFileName,
string textToFind) {
File
.WriteAllLines(targetFileName, File
.ReadLines(sourceFileName)
.SkipWhile(line => !line.Contains(textToFind)));
}