Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除csv文件中的多行_C#_Csv - Fatal编程技术网

C# 删除csv文件中的多行

C# 删除csv文件中的多行,c#,csv,C#,Csv,我有一个csv文件的大日志,我想删除这些文件,直到更接近当前日期,这取决于我提供的输入。 目标: *最小化我的csv日志文件的内容。 *如果未找到所选日期,请通过再次写入文件来保留整个日志(因为据我所知,如果我们正在做某件事,我们会反复阅读该文件)。 表单:我有一个表单包含浏览按钮和一个名为“txtfilename”(在这里显示目录)的文本框。查看我的csv文件中的Datagridview。Datetimepicker是我可以选择的日期。一个按钮可删除多行,直到选择日期。 代码任务:使用stre

我有一个csv文件的大日志,我想删除这些文件,直到更接近当前日期,这取决于我提供的输入。

目标:
*最小化我的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)));
   }