如何跳过csv文件中的空行并继续读取数据行? c#console应用程序

问题描述:

我的CVS文件中有5列,前两列有3个空行。我想跳过这些空行。我知道我必须通过文件循环,但我不知道如何执行此过程。如何跳过csv文件中的空行并继续读取数据行? c#console应用程序

任何建议,将不胜感激。

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Santander .csv"); 
     var fileContents = ReadFile(filePath); 
     foreach (var line in fileContents) 
     { 
      Console.WriteLine(line); 
     } 

     Console.WriteLine("Press any key to exit..."); 
     Console.ReadKey(); 
    } 

    public static IList<string> ReadFile(string fileName) 
    { 
     var results = new List<string>(); 
     var target = File.ReadAllLines(fileName).ToList(); 
     return results; 
    } 
} 
+1

我有点困惑与空的列/行 - 你可以添加一个例子,你的输入是如何? –

+0

column1,column2 column3,column4,column5。只有列3到5包含数据列1和2是空的 – user5813072

+0

您可以添加一个数据示例吗?你问到删除空行但你在这里说什么,他们不为空:) –

使用Where子句只保留不NullOrWhiteSpace(null,为空或只是空格)行:

public static IList<string> ReadFile(string fileName) 
{ 
    return File.ReadAllLines(fileName) 
       .Where(line => !string.IsNullOrWhiteSpace(line)) 
       .ToList(); 
} 

更好地了解你是什么之后再后:对于每行使用Split来获得不同的列,然后检查前2个是否为空:

public static IList<string> ReadFile(string fileName) 
{ 
    return (from line in File.ReadAllLines(fileName) 
      where !string.IsNullOrWhiteSpace(line) 
      let columns = line.Split(',') 
      where columns.Length >= 2 && 
       !string.IsNullOrWhiteSpace(columns[0]) && 
       !string.IsNullOrWhiteSpace(columns[1]) 
      select line).ToList(); 
} 

改为语法查询,只是因为在我看来,这是cleaer当我们开始需要的东西像let


如果你想要的是得到从文件中的所有列的值没有空的,则:

public static IList<string> ReadFile(string fileName) 
{ 
    File.ReadAllLines(fileName) 
     .SelectMany(line => line.Split(',')) 
     .Where(item => !string.IsNullOrWhiteSpace(item)) 
     .ToList(); 
} 
+2

我刚刚意识到这可能会有一些缺失。结果永远不会更新,或者我错过了一些东西。我认为在原始问题中也是如此。 – RosieC

+1

@RosieC - 你是对的。复制原来的,并错过了:)固定 –

+0

@ user5813072 - 编辑,以适应需要 –

如果你对Linq不熟悉/舒服,那么另一种方法就是这样。

public static IList<string> ReadFile(string fileName) 
{ 
    var results = new List<string>(); 
    string[] target = File.ReadAllLines(fileName); 
    foreach (string line in target) 
    { 
    var array = line.Split(','); //If your csv is seperated by ; then replace the , with a ; 
    if (!string.IsNullOrWhiteSpace(array[0]) && !string.IsNullOrWhiteSpace(array[1]) && array.Length >= 2) 
    results.Add(line); 
    } 
return results; 
} 

目标仍然可以定义为无功,但我把它定义为字符串[]使它更加明显,那么你可以做的foreach在阵列上。

不过我喜欢Gilad Green的解决方案,使用Linq。我不太熟悉它,所以它不是我想到的第一个解决方案,但我认为值得熟悉。

+0

我尝试了代码,但它仍然不影响前两个空行 – user5813072

+0

这假设行是完全空的。由于吉拉德格林一直试图澄清你的原始问题,似乎起初你试图摆脱空白的行,但现在并不确定。可以调整此方法,以便在foreach循环内检查列的内容并更改if条件以检查前两列为空。 – RosieC

+0

id就像删除我的csv文件中的2列中的空行一样更清晰 – user5813072