如何读取空行分隔的空格分隔的文本文件

时间:2015-07-08 11:44:21

标签: c# csv whitespace streamreader

我正在尝试使用StreamReader读取以空格分隔的文件。

为此,我逐行读取文件,将它们分成数组并通过提供索引读取特定数据。

问题是在某些行中列是空的。这会导致程序到达错误的项目。

col1       col2      col3
a             b           c
d                         e
f             g           h

例如,我遇到了第二行的问题。

2 个答案:

答案 0 :(得分:1)

除非您有固定的宽度列,否则您不知道哪个值应为空,如果您可以控制格式,则应将值包装在引号中,或者使用带有引号的CSV格式进行值换行,然后使用内部引号,则可以如果在excel :-)免费获得观点的奢侈。

https://en.wikipedia.org/wiki/Comma-separated_values

答案 1 :(得分:1)

我可以看到两种方法。

  1. 使用精确的宽度/空格来查找行内的元素定位

  2. 如果元素少于三个,则分析每行内的元素位置。将每个元素的x位置与标题的x位置进行比较,例如:

        string header = "col1       col2      col3";
        string row1 =   "adfgdgdfg              c";
    
        int[] headerPoss = { header.IndexOf("col1"), header.IndexOf("col2"), header.IndexOf("col3") };
    
        string[] row1Elements = row1.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
    
        int[] rowElementsPos = new int[row1Elements.Length];
    
        for (int i = 0; i < row1Elements.Length; i++)
            rowElementsPos[i] = row1.IndexOf(row1Elements[i]);
    
        for (int i = 0; i < row1Elements.Length; i++)
        {                
            Console.WriteLine("This element is from column {0}", headerPoss.Min(hp => Math.Abs(hp - rowElementsPos[i])) + 1);
        }
        Console.ReadKey();
    
  3. 输出:

    enter image description here