跳过csv文件中的一些空行,并继续读数据行

跳过csv文件中的一些空行,并继续读数据行

问题描述:

我的CVS文件中有4列,前两列有2个空行。我想跳过这些空行。我知道我必须通过文件循环,但我不知道如何执行此过程。跳过csv文件中的一些空行,并继续读数据行

任何建议,将不胜感激。

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; 
    } 
} 

正如你可以在这张图片中看到的,我希望在开始的逗号被删除,并且只显示列中包含数据的行。

enter image description here

+2

什么是期望的输出?这与您之前的问题完全相同:[如何跳过csv文件中的空行并继续使用数据读取行? c#控制台应用程序](http://stackoverflow.com/questions/38954395/how-to-skip-some-empty-rows-in-csv-file-and-continue-reading-rows-with-data-cs#38954692 ) –

+0

数据,数据,数据,数据,数据,数据,数据 数据,数据,数据 存储号,存储名称,这是我想要的输出 – user5813072

+0

是否希望输出是所有字符串的集合列在一起列在一个列表中? –

你可以检查在该行的第一个字符是一个,,如果是的话你就会知道,第一列是空的:

foreach (var line in fileContents) 
{ 
    if(line.Trim().IndexOf(",") == 0) 
    { 
     // first column empty, skip 
     continue; 
    } 
    Console.WriteLine(line); 
} 
+0

我不希望跳过整列,而只是列1和列2中的前两行,如图所示 – user5813072

作为评价和解释,从上一个问题:您可以使用SelectMany将您的所有色谱柱分为收集中的单独物料,然后过滤掉空的物料:

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

@ user5813072 - 这是否帮助您解决问题? –

通常,您必须逐字节读取csv文件来验证它,并在某些单元格包含\ n和时才正确读取它。里面的“

但对于简单的情况下,你可以使用这样的事情:

foreach (var line in fileContents) 
    { 
     if (line.Split(',').Any(s => s == "")) 
      continue; 
     Console.WriteLine(line); 
    } 

,你也有文件阅读功能是一个错误,它总是返回空列表

如果你想。获得无空数据的所有行,那就试试这个:

namespace ConsoleApplication1 
{ 
    using System.Linq; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      string[] lines = new string[3]; 

      string data1 = "data1,data2,data3,data4"; 
      string data2 = ",,data3,data4"; 
      string data3 = "data1,data2,data3,"; 

      lines[0] = data1; 
      lines[1] = data2; 
      lines[2] = data3; 

      var result = lines 
       .Select(line => line.Split(',')) 
       .Where(linePart => linePart.All(part => !string.IsNullOrWhiteSpace(part))) 
       .ToList(); 
     } 
    } 
} 

result将包含string[]线,没有一个列表包含任何空的数据部分。