将文本文件解析为具有不规则行的数据表

时间:2016-01-24 03:26:22

标签: c# datatable string-parsing

我正在尝试将文本文件中的表格数据解析为数据表。

文本文件包含文本

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

        }
    }
}

我收到一个错误,&#34;输入数组长于此表中的列数&#34;

第二次尝试
x.ItemArray = rowArray;

当然因为第二排有&#34; RUN AS&#34;作为第8列的值。它之间还有一个空格,它是整行的常见分割字符,因此在数组的长度和列长度之间产生不匹配。

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

1 个答案:

答案 0 :(得分:0)

假设“RUN AS”是您唯一导致这种情况的字符串,您可以在分割之前运行var sanitizedLine = rowLine.Replace("RUN AS", "RUNAS"),然后再将单词分开。但是,如果这种情况经常发生,您可能需要设置一个条件来检查由拆分生成的数组是否与标头的长度匹配,然后在尝试添加之前将违规索引组合在一个正确长度的新数组中。

但是,理想情况下,您可以使用引号生成输入文件换行字符串,以使您的生活更轻松。