使用c#从csv文件中删除空列

时间:2016-03-17 14:13:35

标签: c# csv

我有包含数据的csv文件

   ABC,BCA,AAA 
   CBA,BSH,updated 
   XYZ



   ,Marketing,YYY

我尝试使用以下代码但是得到了结果

结果: -

 ABC,BCA,AAA 
 CBA,BSH,updated 
 XYZ
    ,Marketing,YYY

代码: -

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;

    namespace RemoveEmptyLines
    {
       class Program
        {
    static void Main(string[] args)
    {

        string path = @"C:\Users\Test\Downloads\222.csv";
        Test test = new Test();
        test.RemoveBlankRowsFromCVSFile(path);      
    }

   }}

   public class Test
    {
       public void RemoveBlankRowsFromCVSFile(string filepath)
         {
              if (filepath == null || filepath.Length == 0)
                  {
                     throw new ArgumentNullException("filepath");
                   }

               if (!File.Exists(filepath))
                  {
                   throw new FileNotFoundException("Could not find CVS      file.", filepath);
                   }

    var tempFileName = Path.GetTempFileName();
    try
    {
        using (var streamReader = new StreamReader(filepath))
        using (var streamWriter = new StreamWriter(tempFileName))
        {
            string line;
            while ((line = streamReader.ReadLine()) != null)
            {
                if (!string.IsNullOrWhiteSpace(line))
                {
                    streamWriter.WriteLine(line);
                }
            }
        }
        File.Copy(tempFileName, filepath, true);
    }
    finally
    {
        File.Delete(tempFileName);
    }
}}

但我希望输出像,

ABC,BCA,AAA 
CBA,BSH,updated 
XYZ,Marketing,YYY

请提前帮助我,谢谢。

有什么方法可以让我得到理想的结果。

2 个答案:

答案 0 :(得分:0)

  • 更新了新数据。但所有建议保持不变

这不是解决方案,而是建议让您真正找到解决方案:

  1. 如果不事先知道每行中预计会有多少列,并且此后所得到的解决方案仍然不合适:您的数据仍然不是正确的CSV格式 LI>

    请在此处查看可接受的CSV格式:http://edoceo.com/utilitas/csv-file-format

    1. 即使您知道列数后,您要求的结果似乎是删除空行,如果以前的数据不正确,则将数据从一行合并到另一行。
    2. 案例:

      ABC,BCA,AAA 
      CBA,BSH,updated 
      XYZ
      
      
      
      ,Marketing,YYY
      

      预期结果:

      ABC,BCA,AAA 
      CBA,BSH,updated 
      XYZ,Marketing,YYY
      

      您对该请求的要求是:

      • 删除空行
      • 删除空格(包括未转义的换行符)
      • 将多行数据合并为一行

        1. 这导致了很多其他问题。

      E.g。这里有什么期望:

      A,,
      ,B,
      C,D,E
      

      或在这里:

      A,B
      ,,C,D
      

      或在这里:

      A,B,C
      ,,D,
      E,F,G
      

      或在这里:

      A,B,
      C,D,E
      

      或在这里:

      A,B
      C,D,E
      

      或在这里

      A,B,C
      D
      
      E,
      
      F G H
      , I
      
      1. 我认为这是一个真实可靠的输入数据的唯一情况是,有更多的信息没有提供来帮助解决问题:关于文件格式以及列中数据的方式结构化。
      2. 因此,可能的前进方向:

        • 问题部分陈述,含糊不清。请 重述。
        • 如果这是一个现实生活中的问题,那就像@ joe-philllips说的那样 修复数据生成器。
        • 以不同方式查看问题并确定 如何最好地识别换行和其他畸形并逃脱 那些正确并写一个适当的CSV解析器,而不是尝试 将所有内容放在一行上。

答案 1 :(得分:0)

这对你有帮助:

using System.IO;
using System.Text;
using System.Text.RegularExpressions;

namespace CSVFixer
{
    public class CSV
    {
        public void fixCSV(string filePath)
        {
            string content = File.ReadAllText(filePath, Encoding.UTF8);
            string reEx = "\\r\\n\\s+";
            content = Regex.Replace(content, reEx,"");                       
            File.WriteAllText(filePath, content, Encoding.UTF8);            
        }
    }
}

您只需要传递参数。

string filePath = @"C:\Users\Ivan\Documents\csv.txt";

您可能需要修改名为reEx的常规表达式,如果您的文件也是.csv,它也可以正常工作。