2016-01-24 50 views
0

我想解析文本文件中的表格数据到数据表中。解析文本文件到不规则行的数据表

文本文件包含文本

PID USERNAME THR PRI NICE SIZE RES STATE TIME WCPU COMMAND 
    11 root  1 171 52  0K 12K RUN  23:46 80.42% idle 
    12 root  1 -20 -139  0K 12K RUN AS 0:56 7.96% swi7: 

的代码,我是喜欢

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var lines = File.ReadLines("bb.txt").ToArray(); 
     var headerLine = lines[0]; 
     var dt = new DataTable(); 
     var columnsArray = headerLine.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 
     var dataColumns = columnsArray.Select(item => new DataColumn { ColumnName = item }); 
     dt.Columns.AddRange(dataColumns.ToArray()); 
     for (int i = 1; i < lines.Length; i++) 
     { 
      var rowLine = lines[i]; 
      var rowArray = rowLine.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 
      var x = dt.NewRow(); 
      x.ItemArray = rowArray; 
      dt.Rows.Add(x); 

     } 
    } 
} 

我得到一个错误,“输入数组比该表中的列数不再是”在第二尝试

x.ItemArray = rowArray; 

偏离过程,因为第二行的“RUN AS”值为第8列。它之间还有一个空格,它是整行的常见分割字符,因此会在数组长度和列长度之间造成不匹配。

这种情况的可能解决方案是什么?

+0

它看起来像你的文件应该制表符分隔,但标签被替换为空格?既然它既不是固定的长度,也不是单个字符分隔的,你可能不得不考虑使用正则表达式来解析它。 – juharr

+0

有没有任何使用正则表达式来解析表格数据的例子。如何在文本下获取文本。就像如何选择所有的USERNAME值 –

+0

你可以改变文本文件吗?例如,如果列中可能包含两个单词,那么您可以事先将它更改为'“RUN AS”而不是'RUN AS',这种方式会更清晰。否则,您可能需要每次检查数组是否包含更多元素,并尝试从第8列开始将每个额外数据折叠到第7列。 – Ian

回答

0

假设“RUN AS”是唯一导致您遇到这种情况的字符串,您可以在分割之前先运行var sanitizedLine = rowLine.Replace("RUN AS", "RUNAS"),然后再将这些单词分离出来。但是,如果发生这种情况的频率更高,则可能需要设置一个条件来检查由split生成的数组是否与头的长度匹配,然后在尝试添加它之前将有问题的索引合并到正确长度的新数组中。

然而,理想情况下,您会改为使用引号生成输入文件包装字符串,以使您的生活更轻松。

+0

RUN AS不是唯一的字符串。它只是一个列值可能包含任何空格分隔字符串的实例。所以现在有一些知道违规列的方法。 –

+0

这是一个Linux产生的结果,不能被迫。 –

+0

没错,如果你使用ps,你应该可以将自己的分隔符添加到输出中。这里有一个例子:http://stackoverflow.com/questions/3114741/generating-a-csv-list-from-linux-ps –