我正在将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
如何从数组中删除所有空行。
谢谢
答案 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;
}