从阵列中删除空条目

时间:2018-11-21 18:00:30

标签: c#

我正在将CSV的内容读取为如下字符串:

string csvData = string.Empty;

using (var reader = new System.IO.StreamReader(file.OpenReadStream()))
            using (ExcelPackage package = new ExcelPackage())
{
  csvData = reader.ReadToEnd();
  int totalLength = csvData.TrimEnd('|').Split('|').Length;
  string[] result = null;
  result = csvData.TrimEnd('|').Split('|');

  if (String.IsNullOrEmpty(result[totalLength-1].Replace(",", "").Trim()))
  {
     result = result.Take(result.Count() - 1).ToArray();
  } 

 //do some processing to the result here.
}   

所以下面是我的示例csvData的内容:

123,a,b,3|456,c,d,5|111,acd,55,c1|,,,,

如果您看到上面的示例,则它确实包含从CSV出来的最后一个空行。要删除上面的空行,请使用上面发布的代码。

一切正常。但是问题出在我有多个空行时,例如下面的示例:

123,a,b,3|456,c,d,5|111,acd,55,c1|,,,,|,,,,|,,,,

通过上面的输入,我的代码仅删除了一个空行。

我希望结果应该没有空行,如下所示:

123,a,b,3|456,c,d,5|111,acd,55,c1

如何从数组中删除所有空行。

谢谢

3 个答案:

答案 0 :(得分:2)

我建议使用CSVHelper。 CSV看起来并不简单。

使用CSVHelper,您可以执行以下操作:

using (var csv = new CsvReader(reader))
{
    csv.Configuration.SkipEmptyRecords = true;
    var records = csv.GetRecords<Foo>().ToArray();
}

答案 1 :(得分:0)

我几乎可以肯定建议您使用CSVHelper或其他工具的人是正确的,但是如果我是手工操作而又不对性能有任何疑问,那么我会这样做:

    private void func()
    {
        string input = "123,a,b,3|456,c,d,5|111,acd,55,c1|,,,,|,,,,|,,,,";

        List<IEnumerable<string>> parsedLines = new List<IEnumerable<string>>();
        foreach (string line in input.TrimEnd('|').Split('|')) //foreach row
            parsedLines.Add(line.Split(',')); //add that as a list of columns
        //select rows that have at least one column with text
        var result = parsedLines.Where(line => line.Any(field => !string.IsNullOrEmpty(field)));
    }

如果目标是在将每个空行变成一组列之前扔掉空行,这将起作用:

        string input = "123,a,b,3|456,c,d,5|111,acd,55,c1|,,,,|,,,,|,,,,";

        var unparsedLines = input.TrimEnd('|').Split('|');
        Regex re = new Regex(@"[^,\s]", RegexOptions.Compiled); //search for any char that is not a comma or whitespace
        var result = unparsedLines.Where(o => re.Match(o).Success);

答案 2 :(得分:0)

s = ",,,|1,2,3|,,,,|,,,|4,56|,,,|,,|,,,,,";
var sprev = s; string res;
while(true)
{
    var snew = Regex.Replace(sprev, "(\\||^),{2,}(\\||$)","|");
    if(snew == sprev) 
    {
        res = snew.Trim('|');
        break;
    }
    sprev = snew;
}