2016-01-24 51 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 –